为什么这个负面的后视固定长度正则表达式不起作用?

时间:2014-03-06 12:04:57

标签: java regex negative-lookbehind

我正在尝试在空格分隔的数字列表中匹配单个“1”。这是一些示例代码:

public class RegexTester {
  public static void main(String[] args) {

    String test1 = "1 2";
    String test2 = "2 1 2";
    String test3 = "2 11 2";

    String regex = "(?<!\\d)1(?!\\d)";

    System.out.println("Matches 1: " + test1.matches(regex));
    System.out.println("Matches 2: " + test2.matches(regex));
    System.out.println("Matches 3: " + test3.matches(regex));
  }
}

输出是:

Matches 1: false
Matches 2: false
Matches 3: false

但应该是(imo):

Matches 1: true
Matches 2: true
Matches 3: false

Lookbehind是固定长度的,所以我很困惑为什么这个正则表达式不匹配。如果您知道为什么和/或可以为此案例提供替代工作正则表达式,我将不胜感激。

谢谢。

1 个答案:

答案 0 :(得分:2)

你的正则表达式是正确的。问题是matches方法检查整个输入字符串是否可以由正则表达式匹配,而不是它是否包含可由正则表达式匹配的子字符串。

也许使用Matcher类中的find()方法。

String test1 = "1 2";
String test2 = "2 1 2";
String test3 = "2 11 2";

String regex = "(?<!\\d)1(?!\\d)";
Pattern p = Pattern.compile(regex);

System.out.println("Matches 1: " + p.matcher(test1).find());
System.out.println("Matches 2: " + p.matcher(test2).find());
System.out.println("Matches 3: " + p.matcher(test3).find());

输出:

Matches 1: true
Matches 2: true
Matches 3: false

更新:

如果您确实需要使用matches,那么您只需在正则表达式的开头和结尾添加.*,因此正则表达式旁边也可以使用除必需部分之外的部分。

String regex = ".*(?<!\\d)1(?!\\d).*";

System.out.println("Matches 1: " + test1.matches(regex));
System.out.println("Matches 2: " + test2.matches(regex));
System.out.println("Matches 3: " + test3.matches(regex));

输出:

Matches 1: true
Matches 2: true
Matches 3: false