我正在尝试在空格分隔的数字列表中匹配单个“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是固定长度的,所以我很困惑为什么这个正则表达式不匹配。如果您知道为什么和/或可以为此案例提供替代工作正则表达式,我将不胜感激。
谢谢。
答案 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