Regex Java per supporto Unicode?

Per abbinare dalla A alla Z, useremo regex:

[A-Za-z]

Come consentire alla regex di associare i caratteri utf8 inseriti dall’utente? Per esempio parole cinesi come 环保 部

Quello che stai cercando sono proprietà Unicode.

ad es. \p{L} è un qualsiasi tipo di lettera da qualsiasi lingua

Quindi una regex per abbinare una parola cinese potrebbe essere qualcosa di simile

 \p{L}+ 

Ci sono molte proprietà di questo tipo, per maggiori dettagli vedi regular-expressions.info

Un’altra opzione è usare il modificatore

Pattern.UNICODE_CHARACTER_CLASS

In Java 7 c’è una nuova proprietà Pattern.UNICODE_CHARACTER_CLASS che abilita la versione Unicode delle classi di caratteri predefinite vedere la mia risposta qui per ulteriori dettagli e collegamenti

Potresti fare qualcosa di simile

 Pattern p = Pattern.compile("\\w+", Pattern.UNICODE_CHARACTER_CLASS); 

e \w corrisponderebbe a tutte le lettere e tutte le cifre di qualsiasi lingua (e ovviamente qualche parola che combina caratteri come _ ).

Per abbinare i singoli caratteri, puoi semplicemente includerli in una class di caratteri, sia come valori letterali o tramite la syntax \u03FB .

Ovviamente spesso non è ansible elencare tutti i caratteri consentiti in lingue ideografiche. Per fare in modo che la regex tratti i caratteri unicode in base al loro tipo o al loro blocco di codice, sono supportate varie altre fughe che qui sono definite. Guarda la sezione “Supporto Unicode”, in particolare i riferimenti alla class di Character e allo stesso standard Unicode.

Per affrontare il supporto NLS ed evitare l’accettazione del carattere speciale inglese, possiamo usare lo schema seguente …

[a-zA-Z0-9 \ u0080- \ u9fff] * +

Per riferimento al punto di codice UTF: http://www.utf8-chartable.de/unicode-utf8-table.pl

Snippet di codice:

  String vowels = "అఆఇఈఉఊఋఌఎఏఐఒఓఔౠౡ"; String consonants = "కఖగఘఙచఛజఝఞటఠడఢణతథదధనపఫబభమయరఱలళవశషసహ"; String signsAndPunctuations = "కఁకంకఃకాకికీకుకూకృకౄకెకేకైకొకోకౌక్కౕకౖ"; String symbolsAndNumerals = "౦౧౨౩౪౫౬౭౮౯"; String engChinesStr = "ABC導字會"; Pattern ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU = Pattern .compile("[a-zA-Z0-9 \\u0c00-\\u0c7f]*+"); System.out.println(ALPHANUMERIC_AND_SPACE_PATTERN_TELUGU.matcher(vowels) .matches()); Pattern ALPHANUMERIC_AND_SPACE_PATTERN_CHINESE = Pattern .compile("[a-zA-Z0-9 \\u4e00-\\u9fff]*+"); Pattern ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN = Pattern .compile("[a-zA-Z0-9 \\u0080-\\u9fff]*+"); System.out.println(ENGLISH_ALPHANUMERIC_SPACE_AND_NLS_PATTERN.matcher(engChinesStr) .matches()); 
  • l’API di espressioni regolari Java funziona sul tipo di char
  • il tipo di char è implicitamente UTF-16
  • se si dispone di dati UTF-8 è necessario transcodificarlo su UTF-16 su input se questo non è già stato fatto

Unicode è l’insieme universale di caratteri e UTF-8 può descriverli tutti (inclusi caratteri di controllo, punteggiatura, simboli, lettere, ecc.) Dovrai essere più specifico su cosa vuoi includere e cosa vuoi escludere. Le espressioni regolari di Java usano la syntax \p{category} per abbinare i codepoints per categoria . Vedi lo standard Unicode per l’ elenco delle categorie.

Se vuoi identificare e separare le parole in una sequenza di ideogrammi, dovrai guardare a un’API più sofisticata. Vorrei iniziare con il tipo BreakIterator .