2009-05-15 2 views
34

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

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

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

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

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


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

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

+0

Обновление: Цель объединения регулярных выражений состоит в том, чтобы уменьшить, если условия для одного. Поскольку это регулярное выражение будет соответствовать большому количеству строк. – nexneo

+1

Что значит «не содержит»? – sarsnake

+0

, если пользователь вводит «круто», а строка не содержит этого слова, означает, что он соответствует. – nexneo

ответ

62

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

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

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

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

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

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

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

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

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

+2

Да, теперь я в порядке с OR. Но спасибо за установку И-версии. Объединение AND и OR не для меня. :) – nexneo

+1

Я пробовал последнее и регулярное выражение, и я заметил, что он имеет синтаксическую ошибку, дополнительный «)» в конце. Я удалил этот символ, но регулярное выражение, похоже, не работало так, как предполагалось, не уверен, что я сделал не так? Я использую .Net для тестирования. –

+0

Это на самом деле второй-последний ')', который там не принадлежит. Как только это исправлено, причина, по которой он не работает, заключается в том, что в нем нет ничего, что потребляет персонажей - это все взгляды. Я мог бы сделать последнюю часть не сообразительной, но для ясности я предпочел бы добавить '. *' До конца. Я исправляю это сейчас; спасибо, что привлек его к моему вниманию. –

3

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

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

2

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

/^[^@]*$/ 

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

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

2

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

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

[1-9] [0-9]

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

Смотрите это для продвинутых справки:

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

Редакцией:

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

+0

Можете ли вы дать более подробную информацию о том, как условие «Не содержит» соответствует приведенному выше предложению. – nexneo

+1

Я предполагаю, что вы хотите выражение, которое «не содержит» что-то (неясно, чего вы хотите, чтобы выражение не содержалось). Мое предложение показывает, как вы это сделаете, если вы не хотите, чтобы выражение содержало цифру 0 в первой позиции, в которой в этом случае вы бы ограничили первую цифру позиции до 1-9. Не совсем понятно, что вы подразумеваете под «не содержит». Не содержит чего? Пожалуйста, уточните, чтобы мы могли вам помочь. Мой ответ был скорее общим ответом.Извините, если это вам не помогло. – sarsnake

+0

gnomixa, Небольшое тестирование показывает, что ваша версия работает хорошо. – nexneo

1

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

+0

@ не будет одинаковым для двух условий, и не все четыре условия всегда присутствуют, но они могут быть и в будущем мне могут потребоваться дополнительные условия, такие как «точно» и «точно нет» и т. Д. так , Мне более любопытно узнать, что этот подход будет масштабироваться? – nexneo

2

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

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

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

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

, но это одна любая строка без @ , sample 'мое имя hal9000'