Как сопоставить только после явного сигнального слова в регулярном выражении? - PullRequest
0 голосов
/ 24 января 2019

Я хочу сопоставить любые "nonchar + цифры" между SIGNAL и END словом.

(?!SIGNAL)\\W+\\d+(?=END)

НО: следующие совпадения +2 и ++7:

random+2END+SIGNAL+random++7END

Почему +2 соответствует здесь? Я только хотел бы ++7 здесь.

Моя последняя цель - заменить матч пробелами.

Пример: https://regexr.com/4727h

Java-код:

Pattern.compile(REGEX).matcher(input).replaceFirst(StringUtils.EMPTY);

1 Ответ

0 голосов
/ 28 января 2019

Вы можете использовать

s.replaceFirst("(SIGNAL.*?)\\W+\\d+(END)", "$1$2")

Соответствует регулярному выражению:

  • (SIGNAL.*?) - Группа захвата 1 ($1): подстрока SIGNAL, а затем любые 0+ символов, другие символы разрыва строки, как можно меньше (так как *? является не жадным, неохотным квантификатором)
  • \W+ - 1 или более несловарных символов (отличных от букв, цифр и _)
  • \d+ - 1+ цифр
  • (END) - Группа захвата 2 ($2): подстрока END
  • $1$2 - две числовые обратные ссылки для замены, относящиеся к значениям группы 1 и группы 2

См. Демонстрационную версию Java :

String s = "random+2END+SIGNAL+random++7END";
System.out.println(s.replaceFirst("(SIGNAL.*?)\\W+\\d+(END)", "$1$2"));
// => random+2END+SIGNAL+randomEND
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...