2016-11-21 1 views
3
String[] words = {"a","ab","ac","abc","aac","aa"}; 
for(String str:words) { 
    if(str.matches("[abc]+")) { 
     System.out.println(str); 
    } 
} 

Dieser Code ausdruckenMake Java regex '[abc] +' Spiel einmal pro Brief

a, ab, ac, abc, aac, aa

Das ist fast, was Ich will, außer ich möchte nicht, dass ein Buchstabe zweimal abgeglichen wird. Ich möchte die Regex [abc]+ so ändern, dass die Übereinstimmung nur einmal auftritt. Die aac und aa sollten nicht gedruckt werden, da aa zweimal übereinstimmt. Kann ich das tun?

+0

Haben Sie nur 3 einzelne Zeichen im realen Leben? Wenn ja, und das obige Beispiel ein sehr vereinfachtes Beispiel dafür ist, was wirklich benötigt wird, dann ist Regex nicht das beste Werkzeug für diese Aufgabe. –

+2

Wenn es keine künstliche Anforderung gibt, einen regulären Ausdruck zu verwenden, würde ich sagen, dass es viel besser ist, dies prozedural auszuführen, indem eine Methode erstellt wird, die die Zeichen in der Zeichenfolge iteriert und in ein "Set" setzt ein Duplikat (wenn [Set.add] (https: //docs.oracle.com/javase/7/docs/api/java/util/Set.html#add \ (E \)) false zurückgibt). – dnault

+5

Ich denke, Ihr Problem ist ähnlich wie: http://stackoverflow.com/questions/12870489/regex-to-match-a-word-with-unique-non-repeating-characters – xBATx

Antwort

2

negative Vorschau Verwenden Sie diese Regex verwenden können:

^(?:([abc])(?!.*\1))+$ 

RegEx Demo

Wenn Sie möchte jedes beliebige Zeichen nicht nur [abc] dann verwenden:

^(?:(.)(?!.*\1))+$ 
  • (.) Einstimmungen und Gruppen jedes Zeichen
  • (?!.*\1) Vorgriffs-negativ, der für jedes Zeichen erfasst, dass dasselbe Zeichen existiert nicht vor der aktuellen Position behauptet.
  • (?:...)+ gruppiert übereinstimmendes Zeichen und Lookahead in einer nicht einfangenden Gruppe, die 1 oder mehrmals wiederholt wird, um die ganze Zeichenfolge zu entsprechen.
0

Wenn Sie wirklich eine Regex wollen und wenn Sie nur [abc] verwenden dürfen, ist es ziemlich einfach, alle Möglichkeiten zu überprüfen: D.

String[] words = { "a", "ab", "ac", "abc", "aac", "aa" }; 
for (String str : words) { 
    if (str.matches("(abc|ab|acb|ac|a|bac|ba|bca|bc|b|cab|ca|cba|cb|c)")) { 
     System.out.println(str); 
    } 
} 

Andernfalls könnten Sie überprüfen, ob der String [abc]+ entspricht, enthalten jedoch keine "([a-c]).*\\1"

0

Ist ab?c? nach was Sie suchen?

+1

Nein, Briefe sind wahrscheinlich nicht sortiert. 'bca' sollte übereinstimmen. –