Какой смысл стоит за пересечениями символьных классов в Java Regex? - PullRequest
11 голосов
/ 10 июля 2009

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

[a-z&&[def]]

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

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

[def]

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

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

Ответы [ 4 ]

4 голосов
/ 10 июля 2009

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

[\p{Ll}&&\p{InBasicLatin}]
1 голос
/ 10 июля 2009

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

1 голос
/ 10 июля 2009

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

String regex = String.format("[%s&&[%s]]", characterClass, whiteList);
1 голос
/ 10 июля 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...