Регулярное выражение Ruby с использованием или внутри символьного класса
Проходя через ruby-doc для регулярных выражений , я наткнулся на этот пример реализации оператора&&:
/[a-w&&[^c-g]z]/ # ([a-w] AND ([^c-g] OR z))
# This is equivalent to:
/[abh-w]/
Я понимаю, что
/[a-w&&[^c-g]]/
Приравнивается к
/[abh-w]/
Потому что " ^ " обозначает символы, которые должны быть исключены из регулярного выражения.
Однако мне интересно, почему "z" также не включен? Почему эквивалентное регулярное выражение не было:
/[abh-wz]/
Я очень новичок в регулярных выражениях, гораздо меньше любые особенности для регулярных выражений в Ruby, так что любая помощь очень ценится!
1 ответ:
Страница явно говорит:
/[a-w&&[^c-g]z]/ # ([a-w] AND ([^c-g] OR z)) # This is equivalent to: /[abh-w]/
"z" не входит в левый " и " термин, поэтому он не может быть сопоставлен.
Смотрите:" все вещи, которые являются одновременно яблоками, а также либо яблоками, либо грушами", не включают груши. Только яблоки являются одновременно и яблоками, и (яблоками или грушами). Аналогично,a
находится в обоихa-w
и[^c-g]z
, поэтому оно совпадает;z
не находится в левой части, поэтому "и" не удовлетворяется, таким образом, все выражение терпит неудачу.