2009-07-09 6 views
11

Regex.Pattern Java obsługuje następujące klasy znaków:Jaki jest sens krzyżowania klasy znaków w Java Regex?

[a-z&&[def]] 

który pasuje do "D, E lub F" i nazywa się skrzyżowanie.

Funkcjonalnie to nie różni się od:

[def] 

który jest prostszy do przeczytania i zrozumienia w dużym RE. Moje pytanie brzmi: jaki jest pożytek z przecięcia, poza określeniem pełnej obsługi operacji typu CSG na klasach postaci?

(Należy pamiętać, rozumiem użyteczność odejmowań jak [a-z&&[^bc]] i [a-z&&[^m-p]], pytam konkretnie o skrzyżowaniach, jak przedstawiono powyżej.)

Odpowiedz

4

Choć nigdy nie miałem potrzeby, aby to zrobić, mogę sobie wyobrazić korzystanie z predefiniowanych klas postaci, które nie są właściwe podzbiory ze sobą nawzajem (dzięki czemu przecięcie powoduje wytworzenie czegoś innego niż oryginalne dwie klasy znaków). Na przykład. pasujące tylko małe litery znaki łacińskie:

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

Być może, ale wynik powyższego RE nie różni się od [\ p {Lower}], ponieważ \ p {Lower} z definicji jest tylko małymi literami w domyślnym alfabecie Jeśli Twój domyślny alfabet nie jest łaciński, to RE faktycznie nic nie da. – Christopher

+0

Zmieniono \ p {Lower} na \ p {Ll}, aby uniknąć domyślnego problemu z alfabetem. – iammichael

1

wierzę, że dana próbka jest tylko „proof of concept”. Dwie przecinające się klasy znaków pasują tylko do postaci, która pasuje do obu zestawów znaków indywidualnie. Wymienione odejścia są prawdziwymi praktycznymi zastosowaniami operatora.

Po prostu nie ma ukrytego znaczenia.

1

można zbudować regexp dopasowanie pomiędzy dwoma zestawami programowo:

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

Ma to sens z teoretycznego punktu widzenia, ale jaki jest praktyczny przykład, w którym kiedykolwiek używałbyś tego? – Christopher

+0

Nie mam teraz żadnego praktycznego przykładu :-( – dfa

1

Przecięcie jest użyteczne, gdy jedna klasa nie jest podzbiorem innego zestawu. Istnieje wiele predefiniowanych klas znaków (częściowa lista jest podana w javadoc), w szczególności różne bloki Unicode. Załóżmy, że istnieje określony blok dla wszystkich znaków używanych w języku chińskim i jeden dla wszystkich znaków używanych w języku japońskim. Występuje duża liczba nakładek, ale nie jest kompletna po obu stronach (nie jestem pewien, czy klasy bloków Unicode odzwierciedlają to). Jeśli chcesz dopasować tylko znaki, które występują w obu językach, możesz użyć przecięcia tych dwóch.