Какова точка пересечения классов символов в 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 отражают это). Если вы хотите совместить только символы, которые встречаются на обоих языках, вы можете использовать их пересечение.