È possibile sottrarre un carattere corrispondente in una classe di caratteri?Pattern: come sottrarre il carattere abbinato nella classe di caratteri?
Java docs stanno avendo esempi di classi di personaggi con la sottrazione:
[a-z&&[^bc]] - a through z, except for b and c: [ad-z] (subtraction)
[a-z&&[^m-p]] - a through z, and not m through p: [a-lq-z](subtraction)
voglio scrivere modello, che corrisponde a due coppie di caratteri di parola, quando le coppie non sono gli stessi:
1) "aaaa123" - should NOT match
2) "aabb123" - should match "aabb" part
3) "aa--123" - should NOT match
I Sono vicino al successo con il seguente schema:
([\w])\1([\w])\2
ma ovviamente non funziona nel caso 1, quindi devo sottrarre la corrispondenza del primo gruppo. Ma quando provo a fare questo:
Pattern p = Pattern.compile("([\\w])\\1([\\w&&[^\\1]])\\2");
io sono sempre un'eccezione:
Exception in thread "main" java.util.regex.PatternSyntaxException: Illegal/unsupported escape sequence near index 17
([\w])\1([\w&&[^\1]])\2
^
at java.util.regex.Pattern.error(Pattern.java:1713)
Così sembra che non funziona con i gruppi, ma solo con la messa in vendita di caratteri specifici. Il seguente schema si compila senza problemi:
Pattern p = Pattern.compile("([\\w])\\1([\\w&&[^a]])\\2");
C'è qualche altro modo per scrivere tale modello?
Le espressioni regolari effettivamente fare uno sguardo fresco: http: // xkcd.it/208/ – flesk
@ Kilian: questo modello è solo uno dei tanti (ce ne sono anche molti semplici) per abbinare le parti di stringa - quindi non è solo per essere "cool" come dici tu - il sistema itera attraverso i pattern e li abbina. .. Se dovessi andare con il tuo modo suggerito - Avrei ancora più soluzione "non cool" in quanto avrei bisogno di aggiungere "ifs" personalizzati per uno o l'altro caso ... – Laimoncijus
@flesk: molto bello, +1 da me ! :) – Laimoncijus