У меня есть код, как этотКомбинирование регэкспы в Руби
(str =~ /regexp1/) && (str !~ /regexp2/) ? "aa" : "bb"
Есть ли способ объединить два регулярных выражений в один чек, чтобы иметь более короткий код?
У меня есть код, как этотКомбинирование регэкспы в Руби
(str =~ /regexp1/) && (str !~ /regexp2/) ? "aa" : "bb"
Есть ли способ объединить два регулярных выражений в один чек, чтобы иметь более короткий код?
Вы можете сделать это, используя отрицательный результат.
(?!.*regexp2)regexp1
.*
необходимо, чтобы убедиться, что regexp2
нет нигде в строке. Напр.
regexp2="bb"
и regexp1 ="cc"
. Здесь .*
не требуется, так как это просто. Но если
regexp2="bb"
и regexp1="ccbbaa"
Здесь .*
необходимо, чтобы убедиться, что bb
нет нигде в строке.
Регулярное выражение vks's делает точку, но не совсем корректно. Сделайте это:
/\A(?!.*#{regexp2}).*#{regexp1}/
Вы можете сделать это немного короче с:
str[/regexp1/] && !str[/regexp2/] ? "aa" : "bb"
Другие решения я вижу здесь ненужная кошмар для парня, который должен прочитать код. Избежать их.
pg, это действительно не касается вопрос. Вопрос заключается не в том, следует ли использовать регулярное выражение для разума, если это необходимо для объединения двух регулярных выражений. Я сомневаюсь, что любой, кто читает это, ответит на этот вопрос утвердительно. Однако может быть полезно научиться, изучая предлагаемые решения, возможные самородки, которые могут иметь приложение в других ситуациях. –
@ Cary Я не согласен, я думаю, что вы ободряете плохой код. – pguardiario
Не могли бы вы объяснить, почему нам нужно «. *»? –
он не будет работать в нескольких случаях. @VictorRonin вы могли бы привести пример? –
Подождите, ваше регулярное выражение запрещает 'regexp2' в точке или после точки, где' regexp1' соответствует, но запрещает ли это 'regexp2', которое появляется до этого? – sawa