Объединить Regexp

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

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

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

Этот метод работает до сих пор, но

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


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

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

Ответ 1

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

Ответ 3

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

/^[^@]*$/

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

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

Ответ 4

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

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

[1-9] [0-9]

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

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

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

Редакция:

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

Ответ 5

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

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

почти то же самое, что:

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

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

Ответ 6

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