И оператор в регулярных выражениях - PullRequest
7 голосов
/ 31 мая 2011

Я некоторое время искал, как использовать логические операции И в регулярных выражениях в Java, и не смог.
Я пытался сделать так, как рекомендовано в аналогичной теме:

(?=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 - вернуть false, если число меньше 1190

[0-9]{1,3}||1[0-0][0-9]{1,2}||11[0-8][0-9]{1,1}||119[0-2] = Y - вернуть false, если число больше 1992.

String a = "1189";
a.matches(X) // return false
a.mathes(Y)  // return true
a.matches((?=X)(?=Y).*) // return true, but should return false.

Добавлено: Да, мое регулярное выражение не правильно. Виноват. Проблема решена. Спасибо всем большое!

Ответы [ 3 ]

6 голосов
/ 31 мая 2011

Я думаю, что вам нужно (?=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));
}
6 голосов
/ 31 мая 2011

(?= работает .

То, что вы делаете неправильно, вы используете matches, но ваше регулярное выражение ничего не соответствует.

(?= является положительным прогнозом нулевой ширины : он не «потребляет» никаких символов, а просто проверяет, что за его позицией следует что-то, совпадающее с его содержимым.

Итак либо замените ваш matches() вызов на Matcher.find() или убедитесь, что в вашем регулярном выражении есть что-то, совпадающее свся строка (.* является общим кандидатом).

1 голос
/ 31 мая 2011

Как ответил Иоахим, в конце добавьте .*:

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

String b = "aaaxxx";
System.out.println(b.matches("(?=aaa)(?=.*dcd).*"));
// => false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...