Какова точка пересечения классов символов в Java Regex?

Java Regex.Pattern поддерживает следующий класс символов:

[a-z&&[def]]

который соответствует "d, e или f" и называется пересечением.

Функционально это ничем не отличается от:

[def]

который проще читать и понимать в большом RE. Поэтому мой вопрос заключается в том, что использование пересечений, кроме указания полной поддержки CSG-подобных операций над классами символов?

(Обратите внимание: я понимаю полезность вычитаний, таких как [a-z&&[^bc]] и [a-z&&[^m-p]], я спрашиваю конкретно о пересечениях, как показано выше.)

Ответ 1

Хотя мне никогда не приходилось это делать, я мог представить себе использование с заранее определенными классами символов, которые не являются надлежащими подмножествами друг друга (таким образом, пересечение создает нечто, отличное от оригинальных двух классов символов), Например. сопоставление только нижних регистров латинских символов:

[\p{Ll}&&\p{InBasicLatin}]

Ответ 2

Я считаю, что конкретный образец - всего лишь "доказательство концепции". Два пересекающихся символьных класса соответствуют только символу, который соответствует обоим наборам символов в отдельности. Подложки, которые вы упомянули, являются реальными практическими приложениями оператора.

Проще говоря, нет скрытого смысла.

Ответ 3

вы можете создать соответствующее регулярное выражение между двумя наборами программно:

String regex = String.format("[%s&&[%s]]", characterClass, whiteList);

Ответ 4

Пересечение полезно, когда один класс не является подмножеством другого набора. Существует много предопределенных классов символов (неполный список указан в javadoc), в частности различные блоки юникода. Предположим, что существует определенный блок для всех символов, используемых на китайском языке, и один для всех символов, используемых на японском языке. Существует много перекрытий, но он не является полным с обеих сторон (я не уверен, что классы блоков unicode отражают это). Если вы хотите совместить только символы, которые встречаются на обоих языках, вы можете использовать их пересечение.