Объединить Regexp?

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

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

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

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

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


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

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

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

  Начинается с: abc
 Заканчивается: xyz
 Содержит: 123
 Не содержит: 456 

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

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

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

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

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

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

И тогда есть возможность комбинированных условий AND и OR – вот где начинается настоящая забава. : D

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

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

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

 /^[^@]*$/ 

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

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

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

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

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

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

но это соответствует любой строке без @, sample ‘мое имя hal9000’

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

например, \ d {2}

[1-9] [0-9]

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

См. Дополнительную информацию:

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

Редакция:

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

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

  • Что такое группа, не связанная с захватом? Что делает (? :)?
  • Регулярное выражение для пароля (не менее 2 цифр и один специальный символ и минимальная длина 8)
  • Есть ли способ превратить вредоносный код в регулярное выражение?
  • Regex соответствует всем после вопросительного знака?
  • Разница между * и + регулярным выражением
  • регулярное выражение для имени и фамилии
  • Как сопоставить числа между X и Y с регулярным выражением?
  • Извлеките информацию внутри всех скобок в R
  • Regex только для первого появления?
  • Что означает? = Означает в регулярном выражении?
  • Извлечение чисел из векторов строк
  • Давайте будем гением компьютера.