2010-04-12 12 views
12

Chcę dopasować coś takiego jak aaa, aaaad, adjjjjk. Coś w stylu ([a-z]) \ 1+ zostało użyte do dopasowania powtarzających się znaków, ale nie jestem w stanie tego rozgryźć na cztery litery.Regex, aby dopasować cztery powtarzające się litery w ciągu używając wzorca Java

+0

Hej chłopaki fajne odpowiedzi, ale mam jeden problem „FFFFFFFF” .matches ("([AZ ]) \\ 1 {3,} ") = true " fffffasdf ".matches (" ([az]) \\ 1 {3,} ") = false " asdffffffasdf ".matches (" ([az]) \\ 1 {3,} ") = false co mogę zrobić dla dwóch pierwszych? –

Odpowiedz

16

Nie wiedząc o składni powtarzania skończonych, własne rozwiązywanie problemów umiejętności powinny prowadzić do tego:

([a-z])\1\1\1 

Oczywiście to nie jest ładna, ale:

  • Działa
  • Sprawuje własne umiejętności rozwiązywania problemów
  • Może to doprowadzić do lepszego zrozumienia koncepcji
    • W tym przypadku, znając odcukrzona formę składni powtarzania skończonej

Hey guys ochłodzenia odpowiedź, ale mam jeden problem

  • "ffffffff".matches("([a-z])\\1{3,}") = true
  • "fffffasdf".matches("([a-z])\\1{3,}") = false
  • "asdffffffasdf".matches("([a-z])\\1{3,}") = false

Co mogę zrobić dla dwóch pierwszych?

Problem polega na tym, że w Javie matches trzeba dopasować cały ciąg; to tak, jakby wzór jest otoczony przez ^ i $.

Niestety nie ma String.containsPattern(String regex), ale zawsze można skorzystać z tej sztuczki od otaczającego wzór z .*:

"asdfffffffffasf".matches(".*([a-z])\\1{3,}.*") // true! 
//       ^^    ^^ 
+0

Jeśli próbujesz dopasować ciąg, w którym szukany ciąg jest tuż przed znakiem końca linii, powyższy wzór nie będzie zgodny. (Nauczyłem się tego na własnej skórze!). Możesz zrobić: "" asdfffffffffasf ".matches (". * ([Az]) \\ 1 {3,} (? S). * ")" Gdzie "(? S)" uruchamia dopasowanie dla znaków końca wiersza . – seinecle

+0

najlepiej jest znaleźć powtarzającą się postać. –

+0

Szukałem tego od ostatnich 2 godzin. Dziękuję Ci bardzo –

21

chcesz dopasować pojedynczy znak, a następnie, że charakter powtórzono jeszcze trzy razy:

([a-z])\1{3} 

UWAGA: W Javie musisz uciec backslashy wewnątrz wyrażeń regularnych.


Aktualizacja: Powodem, dlaczego nie robi tego, co chcesz, to dlatego, że stosując metodę matches która wymaga, że ​​ciąg dokładnie pasuje do wyrażenia regularnego, a nie tylko to, że zawiera wyrażenie regularne. Aby sprawdzić ograniczenie, powinieneś użyć klasy Matcher. Oto przykładowy kod:

import java.util.regex.Pattern; 
import java.util.regex.Matcher; 

class Program 
{ 
    public static void main(String[] args) 
    { 
     Pattern pattern = Pattern.compile("([a-z])\\1{3}"); 
     Matcher matcher = pattern.matcher("asdffffffasdf"); 
     System.out.println(matcher.find()); 
    } 
} 

Wynik:

true 
6

Można umieścić {n} po coś, aby dopasować go n razy, więc:

([a-z])\1{3} 
3

Ogólny wzór regex dla predefinite powtórzenie {4}.

Tak więc tutaj ([a-z]) \ 1 {3} powinno pasować do 4 znaków.

Powiązane problemy