Как сопоставить строку таким образом? - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно проверить, соответствует ли строка этому конкретному шаблону.

Узор:

(цифры) (разрешены все символы) (цифры)

и цифры могут иметь запятую ("." Или ",")!

Например, ввод может быть 500+400 или 400,021+213.443.

Я пытался Pattern.matches("[0-9],?.?+[0-9],?.?+", theequation2), но это не сработало!

Я знаю, что мне нужно использовать метод Pattern.match (regex, String), но я не могу найти правильное регулярное выражение.

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

В вашем регулярном выражении вы должны экранировать точку \., чтобы буквально соответствовать ей, и экранировать \+, иначе это сделает ? a собственнический квантификатор . Для совпадения цифр 1+ необходимо использовать квантификатор [0-9]+

Для данных вашего примера вы можете сопоставить цифры от 1+, за которыми следует необязательная часть, которая соответствует точке или запятой в начале и в конце. Если вы хотите сопоставить 1 раз любой символ, вы можете использовать точку.

Вместо использования точки можно также использовать, например, класс символов [-+*], чтобы перечислить некоторые операторы или список того, что вы бы хотели сопоставить. Если это должно быть единственное совпадение, вы можете использовать якоря для подтверждения начала ^ и конца $ строки.

\d+(?:[.,]\d+)?.\d+(?:[.,]\d+)?

В Java:

String regex = "\\d+(?:[.,]\\d+)?.\\d+(?:[.,]\\d+)?";

Regex demo

Это будет соответствовать:

  • \d+(?:[.,]\d+)? 1+ цифр, за которыми следует дополнительная часть, которая соответствует . или ,, за которой следуют 1+ цифр
  • . Соответствует любому символу (используйте. +), чтобы повторить 1+ раз
  • То же, что и первый шаблон
0 голосов
/ 10 ноября 2018

Работа с числами может быть трудной. Этот подход будет иметь дело с вашими примерами, но проверьте внимательно. Я также не делал «все символы» в средней группе, так как «все» включало бы числа, поэтому вместо этого я предполагал, что поиск следующего не-числа будет уместным.

Это регулярное выражение Java обрабатывает требования:

"((-?)[\\d,.]+)([^\\d-]+)((-?)[\\d,.]+)"

Однако в приведенном выше описании есть потенциальная проблема. Учтите следующее: 300 - -200. Вышеизложенное не будет соответствовать этому случаю.

Теперь, основываясь на примерах, я думаю, что дело в том, что нужно иметь действительный оператор. Количество математических операций, скорее всего, ограничено, поэтому я бы поставил белый список операторов посередине. Таким образом, что-то вроде:

"((-?)[\\d,.]+)([\\s]*[*/+-]+[\\s]*)((-?)[\\d,.]+)"

Я думаю, было бы более уместным. [*/+-] может быть расширен для оператора ^ или любого другого. Теперь, если кто-то начнет добавлять слова (например, mod) в уравнение, то выражение нужно будет изменить.

Вы можете увидеть это регулярное выражение здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...