2013-08-15 13 views
6

Próbuję dopasować wyrażenie regularne do definicji podręczników, które otrzymuję ze strony internetowej. Definicja zawsze zawiera słowo z nową linią, po której następuje definicja. Na przykład:Java Regex wprowadza nową linię w dopasowaniu

Zither 
Definition: An instrument of music used in Austria and Germany It has from thirty to forty wires strung across a shallow sounding board which lies horizontally on a table before the performer who uses both hands in playing on it Not to be confounded with the old lute shaped cittern or cithern 

W moich próbach uzyskania samego słowa (w tym przypadku "Cytra") wciąż otrzymuję znak nowej linii.

Próbowałem zarówno ^(\w+)\s i ^(\S+)\s bez powodzenia. Pomyślałem, że może ^(\S+)$ zadziała, ale wydaje się, że w ogóle nie pasuje do słowa. Testowałem z rubularnym, http://rubular.com/r/LPEHCnS0ri; który wydaje się skutecznie dopasowywać wszystkie moje próby w taki sposób, w jaki chcę, pomimo tego, że Java tego nie robi.

Oto mój urywek

String str = ...; //Here the string is assigned a word and definition taken from the internet like given in the example above. 
Pattern rgx = Pattern.compile("^(\\S+)$"); 
Matcher mtch = rgx.matcher(str); 
if (mtch.find()) { 
    String result = mtch.group(); 
    terms.add(new SearchTerm(result, System.nanoTime())); 
} 

to łatwo rozwiązać poprzez triming wynikowy ciąg, ale wydaje się, że powinna być niepotrzebny jeśli mam już za pomocą wyrażenia regularnego.

Cała pomoc jest bardzo doceniana. Z góry dziękuję!

+2

'\ s' dopasowuje' \ n' między innymi. –

Odpowiedz

8

Spróbuj użyć opcji Pattern.MULTILINE

Pattern rgx = Pattern.compile("^(\\S+)$", Pattern.MULTILINE); 

Powoduje regex rozpoznać ograniczniki linii w ciągu znaków, w przeciwnym razie ^ i $ tylko dopasować początek i koniec łańcucha.

Chociaż nie ma znaczenia dla tego wzorca, metoda Matcher.group() powraca cały mecz, natomiast metoda Matcher.group(int) zwraca dopasowanie do konkretnej grupy przechwytywania (...) oparciu o liczbę można określić. Twój wzorzec określa jedną grupę przechwytywania, którą chcesz przechwycić. Jeśli w swoim Wzorcu uwzględniłeś \s, tak jak napisałeś, próbowałem, to Matcher.group() zawarłoby tę białą spację w swojej wartości zwracanej.

+0

To załatwiło sprawę. Dzięki, nie zdawałem sobie sprawy, że musisz podać wiele linii. –

0

Spróbuj następny:

/* The regex pattern: ^(\w+)\r?\n(.*)$ */ 
private static final REGEX_PATTERN = 
     Pattern.compile("^(\\w+)\\r?\\n(.*)$"); 

public static void main(String[] args) { 
    String input = "Zither\n Definition: An instrument of music"; 

    System.out.println(
     REGEX_PATTERN.matcher(input).matches() 
    ); // prints "true" 

    System.out.println(
     REGEX_PATTERN.matcher(input).replaceFirst("$1 = $2") 
    ); // prints "Zither = Definition: An instrument of music" 

    System.out.println(
     REGEX_PATTERN.matcher(input).replaceFirst("$1") 
    ); // prints "Zither" 
} 
2

z wyrażeniami regularnymi pierwsza grupa jest zawsze pełna dopasowanie ciąg. W twoim przypadku chcesz grupa 1, grupa nie 0.

więc zmiana mtch.group() do mtch.group(1) powinno załatwić sprawę:

String str = ...; //Here the string is assigned a word and definition taken from the internet like given in the example above. 
Pattern rgx = Pattern.compile("^(\\w+)\s"); 
Matcher mtch = rgx.matcher(str); 
if (mtch.find()) { 
    String result = mtch.group(1); 
    terms.add(new SearchTerm(result, System.nanoTime())); 
} 
+0

Pokonaj mnie. 1+. –

+0

+1 do was obu za bicie mnie :) – anubhava

+0

Dobrze wiedzieć, naprawdę doceniam te informacje! –

1

wystarczy wymienić:

String result = mtch.group(); 

według:

String result = mtch.group(1); 

To ograniczy moc wyjściową do zawartości capturing group (np. . (\\w+)).

Powiązane problemy