2013-03-26 15 views
5

Obecnie pracuję w regex w Javie i chcę spróbować znaleźć duplikaty słów w ciągach. Jeśli wprowadziłem ciąg znaków, taki jak "To jest świetne.". Używałem \\b(\\w+) \\1\\b, ale to rozpoznaje tylko dwa zduplikowane słowa, takie jak "this this" w ciągu znaków.Znajdowanie zduplikowanych słów w ciągu tekstowym regex C/W

Każda pomoc w tej sprawie?

+0

Dlaczego chcesz użyć w tym celu wyrażenia regularnego? Możesz po prostu przekonwertować do tablicy String za pomocą podziału, a następnie istnieje wiele opcji do wymyślenia duplikatów słów –

+0

Jeśli naprawdę zaczynasz używać _dotkania_ w regex, jest to prawdopodobnie zbyt skomplikowane miejsce do rozpoczęcia ... Nie do wspomnieć, że regex jest prawdopodobnie niewłaściwym narzędziem do pracy. Byłoby to ** dużo ** łatwiejsze do zrobienia przy użyciu podstawowych metod łańcuchowych. – jahroy

+0

Powinienem wcześniej powiedzieć, ale robię te przykłady regex dla mojego kursu uczelni/uniwersytetu, i ten przykład jest jedyny, który został. Zostałem na nie zakłopotany przez wiele godzin! –

Odpowiedz

2

Dodaj "przypadek ignorowania" przełączyć (?i) do regex:

(?i)\\b(\\w+) \\1\\b 

Alternatywnie, można złożyć wejście do dolnego przypadku pierwszy:

input.toLowerCase() 

Uwaga: Jeśli używasz String.matches() , wyrażenie regularne musi pasować do całego wpisu , więc dodajesz .* do obu końców swojego regexu:

.*(?i)\\b(\\w+) \\1\\b.* 
+0

To nie działa dla mnie, działa z dwoma słowami obok siebie. Ale "To nie działa" nie ma. –

+0

Te słowa są obok siebie ;-) – jahroy

+0

Rozumiem, że: P, gdy używam więcej niż dwóch słów w ciągu, to nie rozpoznaje, że oba słowa (które są obok siebie) są tym samym słowem. –

1
String pattern = "\\b(\\w+)(\\b\\W+\\b\\1\\b)*"; 
Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE); 

Można użyć Matcher.group() i Matcher.group(1) zastąpić wszystkie zduplikowane słowa z takim podejściem.

Powiązane problemy