Как я могу выразить такое требование с помощью регулярного выражения Java? - PullRequest
3 голосов
/ 03 сентября 2010

Мне нужно проверить, что файл содержит некоторые суммы, которые соответствуют определенному формату:

  • от 1 до 15 символов (цифры или ",")
  • может содержать не более одного знака "," для десятичных дробей
  • должен содержать хотя бы один номер перед разделителем
  • эта сумма должна быть в середине строки, ограниченной буквенными символами (но мы должны исключить искаженные файлы).

У меня сейчас есть это:

\d{1,15}(,\d{1,14})?

Но это не соответствует требованию, так как здесь я могу поймать до 30 символов.
К сожалению, по некоторым причинам, которые здесь слишком длинны для объяснения, я не могу просто выбрать подстроку или использовать любой другой вызов Java. Совпадение должно быть в одном java-совместимом регулярном выражении.

1 Ответ

11 голосов
/ 03 сентября 2010
^(?=.{1,15}$)\d+(,\d+)?$
  • ^ начало строки
  • (?=.{1,15}$) положительный прогноз , чтобы убедиться, что общая длина строки составляет от 1 до 15
  • \d+ одна или несколько цифр (ов)
  • (,\d+)? необязательно с запятой и несколькими цифрами
  • $ конец строки (на самом деле не требуется, так как мы уже проверяли это в запросе).

Возможно, вам придется избежать обратной косой черты для Java: ^(?=.{1,15}$)\\d+(,\\d+)?$

обновление: если вы ищете это в середине другой строки, используйте границы слов \b вместо границ строк (^ и $).

\b(?=[\d,]{1,15}\b)\d+(,\d+)?\b

Для Java:

"\\b(?=[\\d,]{1,15}\\b)\\d+(,\\d+)?\\b"

Более читаемая версия:

"\\b(?=[0-9,]{1,15}\\b)[0-9]+(,[0-9]+)?\\b"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...