正则表达式中的AND运算符

时间:2011-05-31 09:18:48

标签: java regex

我已经搜索了一段时间如何在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 - 如果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.

添加了: 是的,我的正则表达式不正确。我的错。问题解决了。非常感谢大家!

3 个答案:

答案 0 :(得分:6)

(?= 工作。

你做错了是你正在使用matches,但你的正则表达式与任何东西都不匹配。

(?=zero-width positive look-ahead:它不会“消费”任何字符,只是验证其位置后跟的是与其内容相匹配的内容。

所以要么用[{3}} 替换你的matches()来电或,请确保你的正则表达式中有一些与整个字符串匹配的内容({ {1}}是一个常见的候选人。)

答案 1 :(得分:6)

我认为您需要的是(?=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));
}

答案 2 :(得分:1)

当Joachim回答时,最后添加一个.*

String b = "aaadcd";
System.out.println(b.matches("(?=aaa)(?=.*dcd).*"));
// => true

String b = "aaaxxx";
System.out.println(b.matches("(?=aaa)(?=.*dcd).*"));
// => false