Регулярное выражение 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 2

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 не находится в левой части, поэтому "и" не удовлетворяется, таким образом, все выражение терпит неудачу.