Java和正则表达式中的lookbehind

5
我试图寻找以下正则表达式: 所有完全匹配@WORD@的单词,其中WORD可以是任何单词,但仅在=之后。 我做了以下内容:
(?<==)#.*?#)它有效,但仅适用于模式=@SOMEWORD@@ANOTHERWORD@,而不适用= @WORD@
我也对跟随=感兴趣,但无法弄清楚。
无论如何,使用类似于: (?<=\\s*=\\s*)#.*?#) 但它不起作用。
有什么想法吗? 注意:奇怪的是,从这里中可以看到Java不支持变长回溯,但这并未给我带来异常。
2个回答

1
如果您正在使用回顾后断言,我假设您直接使用PatternMatcher来捕获单词(使用"@WORD@"而不是"= @WORD@")。
如果确实如此,您只需要在回顾后断言中添加一个可选的空格即可:

(?<==\\s?)@.*?@


这是一个测试代码,返回"@WORD@"

Matcher m = Pattern.compile("(?<==\\s?)@.*?@").matcher("= @WORD@");
m.find();
System.out.println(m.group());

0

这个模式匹配一个等号,后面跟着一个可选的空格和一个用@符号包围的单词:

Pattern pattern = Pattern.compile("= ?@(.*)@");
Matcher matcher = pattern.matcher("=@WORD@");
if (matcher.matches()) {
  System.out.println(matcher.group(1));
}

// Prints: "WORD"

除非我误解了您想要完成的任务,否则看不出需要使用向后查找。不过,以下方法应该可以实现:

Pattern pattern = Pattern.compile("(?<== ?)@(.*)@");
Matcher matcher = pattern.matcher("= @WORD@");
if (matcher.find()) {
  System.out.println(matcher.group(1));
}

// Prints: "WORD"

负模式的实现如下所示:
Pattern pattern = Pattern.compile("(?<!= ?)@(.*)@");
Matcher matcher = pattern.matcher("=@WORD@");
System.out.println(matcher.find());

// Prints: "false"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接