gpt4 book ai didi

Java正则表达式用于匹配字符串中的多个键

转载 作者:行者123 更新时间:2023-11-30 03:49:17 24 4
gpt4 key购买 nike

考虑一个输入字符串

Number ONE=1 appears before TWO=2 and THREE=3 comes before FOUR=4 and FIVE=5

和正则表达式

\b(TWO|FOUR)=([^ ]*)\b

使用此正则表达式,以下代码可以从总共 5 个键值对中提取 2 个特定的键值对(即,只应提取一些预定义的键值对)。

  public static void main(String[] args) throws Exception {
String input = "Number ONE=1 appears before TWO=2 and THREE=3 comes before FOUR=4 and FIVE=5";
String regex = "\\b(TWO|FOUR)=([^ ]*)\\b";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while (matcher.find()) {
System.out.println("\t" + matcher.group(1) + " = " + matcher.group(2));
}
}

更具体地说,上面的 main() 方法打印

TWO = 2
FOUR = 4

但每次调用 find() 时,都会对整个正则表达式进行评估,以查找最新匹配项之后剩余的字符串部分(从左到右)。

此外,如果键不是相互不同的(或者,如果在每个键的位置使用具有重叠匹配的正则表达式),则会有多个匹配。例如,如果正则表达式变为

\b(O.*?|T.*?)=([^ ]*)\b

上述方法产生

ONE = 1
TWO = 2
THREE = 3

如果正则表达式没有完全重新评估,但每个替代部分都以某种方式检查一次(或者,如果使用了适当修改的正则表达式),则输出将是

ONE = 1
TWO = 2

那么,有两个问题:

  1. 与原始正则表达式相比,是否有更有效的方法来提取一组选定的唯一键及其值?
  2. 是否有一个正则表达式可以匹配 OR (|) 子表达式的每个替代部分一次并且不再对其进行求值?

最佳答案

Java 返回匹配位置:您可以对剩余子字符串使用动态生成的正则表达式

了解它可以推广到更复杂和有用的场景后,让我们对第一个示例进行一些变体:\b(TWO|FOUR|SEVEN)=([^ ]*)\b

你可以像这样使用它:

Pattern regex = Pattern.compile("\\b(TWO|FOUR|SEVEN)=([^ ]*)\\b");
Matcher regexMatcher = regex.matcher(yourString);
if (regexMatcher.find()) {
String theMatch = regexMatcher.group();
String FoundToken = = regexMatcher.group(1);
String EndPosition = regexMatcher.end();
}

然后你可以:

  • 测试 FoundToken 包含的值
  • 根据该值,动态生成针对剩余可能标记的正则表达式测试。例如,如果您找到 FOUR,您的新正则表达式将为 \\b(TWO|SEVEN)=([^ ]*)\\b
  • 使用 EndPosition,将该正则表达式应用于字符串的末尾。

讨论

  • 此方法将有助于您实现不重新评估已匹配的 OR 部分的目标。
  • 它还有助于您避免重复的目标。
  • 这样会更快吗?不是在这个简单的例子中。但您说您正在处理一个实际问题,并且在某些情况下这将是一种有效的方法。

关于Java正则表达式用于匹配字符串中的多个键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24836588/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com