5

我正在尝试为以下内容查找正则表达式:

@WORD@与where 完全匹配的所有世界WORD都可以是任何单词,但仅在=. 我做了以下内容:
(?<==)#.*?#)这适用于但仅适用于=@SOMEWORD@@ANOTHERWORD@不适用于= @WORD@.
我也有兴趣被跟踪,=但无法弄清楚。
无论如何使用类似的东西:(?<=\\s*=\\s*)#.*?#)但它不起作用。
有任何想法吗?

注意:奇怪,但从这里它说Java支持可变长度后视,但这并没有给我一个例外

4

2 回答 2

1

如果您使用后视,我假设您正在使用PatternandMatcher直接捕获单词 clean ("@WORD@"而不是"= @WORD@")。

如果确实如此,您需要做的就是在后视中添加一个可选的空白:

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


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

Matcher m = Pattern.compile("(?<==\\s?)@.*?@").matcher("= @WORD@");
m.find();
System.out.println(m.group());
于 2012-11-13T20:10:32.823 回答
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"
于 2012-11-12T09:04:00.180 回答