Объединить регулярное выражение? - PullRequest
51 голосов
/ 15 мая 2009

После сбора пользовательского ввода для различных условий, таких как

  1. Начинается с: /(^@)/
  2. Заканчивается на: /(@$)/
  3. Содержит: /@/
  4. Не содержит

Чтобы сделать одно регулярное выражение, если пользователь вводит несколько условий, Я объединяю их с "|", так что если 1 и 2 с учетом этого становится /(^@)|(@$)/

Этот метод пока работает, но

Я не могу правильно определить, каким должно быть регулярное выражение для 4 условия? И объединение регулярных выражений таким образом работает?


Обновление: @ (ввод пользователя) не будет таким же для двух условий, а не для всех четырех условия всегда присутствуют, но они могут быть и в будущем мне может понадобиться больше условия, такие как «точно» и «это точно нет "и т. д. так, мне более любопытно знать, что этот подход будет масштабироваться?

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

Ответы [ 6 ]

83 голосов
/ 15 мая 2009

Будут ли условия ORed или ANDed вместе?

Starts with: abc
Ends with: xyz
Contains: 123
Doesn't contain: 456

Версия OR довольно проста; как вы сказали, это в основном вопрос вставки труб между отдельными условиями. Регулярное выражение просто прекращает поиск совпадения, как только совпадает одна из альтернатив.

/^abc|xyz$|123|^(?:(?!456).)*$/

Эта четвертая альтернатива может выглядеть странно, но именно так вы выражаетесь "не содержится" в регулярном выражении. Кстати, порядок альтернатив не имеет значения; это фактически то же регулярное выражение:

/xyz$|^(?:(?!456).)*$|123|^abc/

Версия AND более сложная. После каждого отдельного регулярного выражения позиция соответствия должна быть сброшена на ноль, чтобы следующий регулярный оператор имел доступ ко всему входу. Это означает, что все условия должны быть выражены в виде предварительных заявлений (технически одно из них не должно быть предварительным просмотром, я думаю, что таким образом оно выражает намерение более четко). Финал .*$ завершает матч.

/^(?=^abc)(?=.*xyz$)(?=.*123)(?=^(?:(?!456).)*$).*$/

И затем есть возможность комбинировать условия И и ИЛИ - вот где начинается настоящее веселье. : D

3 голосов
/ 15 мая 2009

Если строка не должна содержать @, каждый символ должен отличаться от @:

/^[^@]*$/

Это будет соответствовать любой строке любой длины, которая не содержит @.

Другим возможным решением было бы инвертировать логический результат /@/.

3 голосов
/ 15 мая 2009

Не содержит @: / (^ [^ @] * $) /

Объединение работает, если предполагаемый результат объединения состоит в том, что любое из них совпадает с результатами в полном сопоставлении регулярного выражения.

2 голосов
/ 24 октября 2010

1 + 2 + 4 условия: начинается | заканчивается, но не в середине

  /^@[^@]*@?$|^@?[^@]*@$/

- это почти то же самое, что и

  /^@?[^@]*@?$/

но эта соответствует любой строке без @, пример "меня зовут hal9000"

2 голосов
/ 15 мая 2009

По моему опыту с регулярными выражениями, вам действительно нужно сосредоточиться на том, что именно вы пытаетесь сопоставить, а не на том, что НЕ подходит.

например \ Д {2}

[1-9] [0-9]

Первое выражение будет соответствовать любым 2 цифрам .... а второе будет соответствовать 1 цифре от 1 до 9, а 1 цифре - любая цифра. Поэтому, если вы введете 07, первое выражение подтвердит его, а второе - нет.

См. Это для дополнительной справки:

http://www.regular -expressions.info / refadv.html

РЕДАКТИРОВАНИЕ:

^((?!my string).)*$ Является ли регулярное выражение для не содержит "моя строка".

1 голос
/ 15 мая 2009

Объединение регулярного выражения для четвертого варианта с любым другим не работает в пределах одного регулярного выражения. 4 + 1 будет означать, что строка начинается с @ или вообще не содержит @. Для этого вам понадобятся два отдельных сравнения.

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