我已经搜索了一段时间如何在Java中的正则表达式中使用逻辑运算AND,并且失败了.
我尝试按类似主题推荐:
(?=match this expression)(?=match this too)(?=oh, and this)
Run Code Online (Sandbox Code Playgroud)
它不起作用.即使是?=的简单示例也会返回false:
String b = "aaadcd";
System.out.println(b.matches("(?=aa.*)"));
Run Code Online (Sandbox Code Playgroud)
我也读过这(expression X)(expression Y)应该是有效的X AND Y,但它的工作原理就像X OR Y.
我究竟做错了什么?
补充:试图添加.*到底.还是不行.
举个例子:
[2-9]?[0-9]{5,9}||1[2-9][0-9]{1,2}||120[0-9]{1,1}||119[0-9] = X - 如果number小于1190,则返回false
[0-9]{1,3}||1[0-0][0-9]{1,2}||11[0-8][0-9]{1,1}||119[0-2] = Y - 如果数字大于1992,则返回false.
String a = "1189";
a.matches(X) // return false
a.mathes(Y) // return true
a.matches((?=X)(?=Y).*) // return true, but should return false.
Run Code Online (Sandbox Code Playgroud)
补充:是的,我的正则表达式不正确.我的错.问题解决了.非常感谢大家!
(?= 确实有效.
你做错了就是你正在使用matches但你的正则表达式与任何东西都不匹配.
(?=是零宽度正向前瞻:它不会"消耗"任何字符,而只是验证其位置后面跟着与其内容匹配的内容.
因此要么替换你的matches()电话,要么确保你的正则表达式中有一些与整个字符串匹配的东西(是一个常见的候选者).Matcher.find() .*
我想你需要的是 (?=X)Y
(?=X) 匹配X,不消耗它(零宽度)Y 并匹配Y. 主要问题:X和Y错了,应该是(假设4位数):
X: 119[0-9]|1[2-9][0-9]{2}|[2-9][0-9]{3}
Y: 1[0-8][0-9]{2}|19[0-8][0-9]|199[0-2]
这里有一个测试代码:
// X - return false if number is less than 1190
String X = "119[0-9]|1[2-9][0-9]{2}|[2-9][0-9]{3}";
// Y - return false if number is greater than 1992.
String Y = "1[0-8][0-9]{2}|19[0-8][0-9]|199[0-2]";
String pattern = "(?=" + X + ")" + Y;
String values = "1000 1100 1180 1189 1190 1191 1199 1200 1290 1900 1980 1989 " +
"1990 1991 1992 1993 1999 2000 3000 2991 9999";
for (String string : values.split(" ")) {
System.out.printf("\"%s\" %s%n", string, string.matches(pattern));
}
Run Code Online (Sandbox Code Playgroud)