正则表达式中的AND运算符
我已经搜索了一段时间如何在Java中使用正则表达式中的逻辑运算AND,并且失败了。
我尝试按类似主题推荐:
(?=match this expression)(?=match this too)(?=oh, and this)
它不起作用。 即使是?=的简单示例也会返回false:
String b = "aaadcd"; System.out.println(b.matches("(?=aa.*)"));
另外我读过(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 – 如果数字小于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.
补充:是的,我的正则表达式不正确。 我的错。 问题解决了。 非常感谢大家!
我想你需要的是(?=X)Y
-
(?=X)
匹配X,不消耗它(零宽度) -
Y
并匹配Y.
主要问题:X和Y错了,应该是(假设4位数):
X: 119[0-9]|1[2-9][0-9]{2}|[2-9][0-9]{3}
- 1190-1199,或
- 1200-1999,或
- 2000-9999
Y: 1[0-8][0-9]{2}|19[0-8][0-9]|199[0-2]
- 1000-1899,或
- 1900-1980,或
- 1990-1992
这里有一个测试代码:
// 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)); }
(?=
确实有效。
你做错了是你正在使用matches
但你的正则表达式与任何东西都不匹配。
(?=
是一个零宽度正向前瞻 :它不会“消耗”任何字符,而只是validation其位置后面是与其内容匹配的内容。
所以要么用Matcher.find()
替换你的matches()
调用, Matcher.find()
确保你的正则表达式中有一些东西与整个字符串匹配( .*
是一个常见的候选者)。
正如约阿希姆回答的那样,最后添加一个.*
:
String b = "aaadcd"; System.out.println(b.matches("(?=aaa)(?=.*dcd).*")); // => true String b = "aaaxxx"; System.out.println(b.matches("(?=aaa)(?=.*dcd).*")); // => false