Java Regex Lookahead Условно - PullRequest
       21

Java Regex Lookahead Условно

1 голос
/ 17 апреля 2020

У меня есть регулярное выражение, которое работает, но, к сожалению, не в Java, потому что Java не поддерживает этот тип встроенного модификатора.

Я уже читал об этой топике c, например, здесь:

My regex:

(?(?=\d{1,2}[.]\d{1,2}[.]\d{2,4})somerandomtextwhichisnotinthetext|^((($|EUR)? ?[-+]?(\d{1,8}[.,])*\d+([.,]\d+)?)|([-+]?(\d{1,8}[.,])*\d+([.,]\d+)? ?($|€|EUR)?))$)

Я также пытался посмотреть назад, но шаблон, которому он должен соответствовать, имеет переменную длину, и это, к сожалению, не поддерживается ...

Регулярное выражение должно мне соответствовать всем этим шаблон (необходимо полное совпадение -> matcher.group (0)):

  • 123,342,22
  • 123,233.22
  • 232,11
  • 232,2
  • 232,2 €

но не это:

  • 06.01.99

И это должно быть реализовано в Java.

Но все же у меня нет решения ...

Спасибо за вашу помощь !!!

1 Ответ

2 голосов
/ 17 апреля 2020

Суть в том, что вам нужно использовать первую часть как отрицательный прогноз, чтобы добавить исключение к другому шаблону:

^(?!\d{1,2}[.]\d{1,2}[.]\d{2,4}$)((($|EUR)? ?[-+]?(\d{1,8}[.,])*\d+([.,]\d+)?)|([-+]?(\d{1,8}[.,])*\d+([.,]\d+)? ?($|€|EUR)?))$
 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

См. Демонстрационный пример regex

Таким образом, вместо того, чтобы требовать шаблон исключения и затем не соответствовать фиктивной строке, имеет смысл просто использовать действительный шаблон соответствия и добавить исключение в начале.

Я также вижу ($|€|EUR)?, вы, вероятно, хотели найти здесь символ доллара. Если я прав, замените его на ([$€]|EUR)?. Кроме того, ($|EUR)? также может потребоваться заменить на ([$€]|EUR)?.

Кроме того, рассмотрите возможность использования не захватывающих групп , а не собирающих группы, поскольку вы говорите, что заинтересованы только в значениях полного соответствия .

...