Regex, сопоставлять только со строками, которые содержат один случай определенных символов - PullRequest
1 голос
/ 09 апреля 2020

У меня есть следующее регулярное выражение:

^[-]?([+]?[\d]+[-+*/]?)+$

Моя цель - сопоставить строки, содержащие арифметические c выражения и целые числа. В чем это успешно, кроме одного случая. Когда дело доходит до знаков равенства. Я хочу, чтобы это выражение совпадало со строками, содержащими не более одного знака равенства. Что означало бы, что оно будет соответствовать

7 = 7

, но не

7 = 7 = 7

поскольку вторая строка имеет два вхождения знака равенства.

Я попытался использовать фигурные скобки {}, и мне кажется, что мне нужно что-то вроде

={0,1}

, которое будет соответствовать строкам, которые имеют ровно один или нет вхождений "=". Но я, к сожалению, не знаю, как включить это в мое регулярное выражение.

1 Ответ

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

Поскольку вы хотите сопоставлять только арифметические c выражения и целые числа, я изменил ваш код, чтобы найти все, если в нем есть числа, операторы или знак равенства: ^[-+*\/\d=]+$. Мне нужно было экранировать символ / -> \/

Чтобы соответствовать только одному знаку равенства, я добавляю отрицательный результат: (?!.*=.*=). Если он находит то, что находится внутри скобок, все регулярные выражения не будут совпадать. Например, если у вас есть слово mytext: (?!mytext), все регулярные выражения не будут совпадать. .* означает, что он находит все (. обозначает каждый символ, а * говорит, что он может быть там от 0 до неограниченного времени).

Итак, вот решение:

^(?!.*=.*=)[-+*\/\d=]+$

Смотрите живой пример здесь: https://regex101.com/r/zhSEmf/1/

Также ваш код не работал для -4 * -4.

Редактировать: так как вы не хотите Ваш код, чтобы начать с / или * Я добавил идентификатор в отрицательном виде: ^(?!.*=.*=|[\/*].*)[-+*\/\d=]+$

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