2011-08-17 12 views
5

Mam tekst i za pomocą tego prostego wyrażenia regularnego podzielić je na słowa: [ \n]. Dzieli tekst na słowa za pomocą spacji i linii podziału.Jak podzielić tekst za pomocą wyrażenia regularnego, ale podzielone słowa nadal zachowują separator regex?

Chcę wiedzieć, czy istnieje sposób, aby zachować białe znaki lub podział wiersza w splited słowo, ponieważ użyję tego do prostego wykrywania zdanie po pewnym przetwarzaniu.

Używam metody String#split.

+0

Czy Twój \ n oznacza coś specjalnego (koniec zdania)? Nie przetwarzasz normalnych akapitów w wielu liniach z "." jako koniec zdania? – toto2

+0

@ toto2 Interpunkcja jest również używana do określenia końca zdania, ale treść pochodzi z treści HTML, więc wiele zdań, takich jak tytuł, nie ma interpunkcji określającej, gdzie kończą się zdania, tylko podział wiersza. –

+0

Nie jestem pewien, czy powinieneś polegać na \ n podczas przetwarzania HTML, ponieważ możesz mieć doskonale czysty dokument bez pojedynczego \ n. – toto2

Odpowiedz

7

Można użyć lookbehind jak @Piotr Findeisen zasugerował (+1):

public class RegexExample{ 
    public static void main(String[] args) { 
    String s = "firstWordWithSpaceAfter secondWordWithSpaceAfter wordWithLineBreakAfter\nlastWord"; 
    String sa[] = s.split("(?<=[ \\n])"); 
    for (String saa : sa) 
     System.out.println("[" + saa + "]"); 
    } 
} 

wyjściowa:

[firstWordWithSpaceAfter ] 
[secondWordWithSpaceAfter ] 
[wordWithLineBreakAfter 
] 
[lastWord] 

Krótkie wyjaśnienie:

?<= to patrzeć z tyłu, co oznacza, że ​​masz Dopasuj, jeśli dane przed wyrażeniem, którego szukasz, są równe regexowi przychodzącemu po ?<= (w tym przypadku [ \\n])

[ \\n] jest regex to znaczy jeden z bohaterów w []

więc cały regex podzielonego za każdym razem mówi, że postać przed ekspresji/słowo jest albo przestrzeń lub \n.

Ponieważ nie próbowaliśmy dopasować przestrzeni lub \n, nie zostaną one usunięte.

+0

Wygląda na to, że działa, ale ... czy możesz wyjaśnić wyrażenie regularne? –

+0

@Renato Dinhani Conceição - Nie jestem ekspertem od wyrażeń regularnych, ale mam nadzieję, że zredaguje to wystarczająco jasno. – MByD

+0

Umieszczasz swoje wyrażenie w nawiasie. To jest niezbędne? –

5

Należy użyć wyrażenia o zerowej szerokości w kierunku do tyłu/do przodu. Zobacz Pattern javadoc wokół konstrukcje specjalne (non-przechwytywanie)

0

Myślę, że jedynym rozwiązaniem jest zrobić coś takiego:

String myString = "Joe Blow\n1234 Fake Road\nHere, There, 12345"; 
String[] lines = myString.split("\\n"); 
Set<String[]> wordsByLine = new LinkedHashSet<String[]>(); 
for (String line : lines) { 
    wordsByline.add(line.split(" ")); 
} 
0

Naprawdę szybko wyłączyć mojej głowie, jeśli regex zawsze dopasowanie pojedynczych znaków, można użyć długości, aby określić, gdzie siedzą w oryginalnym napisie. Następnie możesz wziąć podciąg znaków dla znaku ograniczającego.

Nieco brudna, ale powinna wystarczyć.

-1

Nadal nie jestem pewien, co próbujesz zrobić, ale jeśli \ n ma inne znaczenie niż "", powinieneś poradzić sobie z nimi osobno.

String[] sentences = text.split("\\n"); 
... 
for (String sentence : sentences) { 
    ... 
    String[] words = sentence.split(" "); 
    ... 
} 
Powiązane problemy