2013-08-15 16 views
6

Ich versuche, einen regulären Ausdruck zu Lehrbuchdefinitionen zu entsprechen, die ich von einer Website bekomme. Die Definition enthält immer das Wort mit einer neuen Zeile gefolgt von der Definition. Zum Beispiel:Java Regex enthält neue Zeile in Übereinstimmung

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 

In meinen Versuchen, nur das Wort (in diesem Fall "Zither") zu bekommen, bekomme ich immer das Newline-Zeichen.

Ich habe sowohl ^(\w+)\s und ^(\S+)\s ohne viel Glück versucht. Ich dachte, dass vielleicht ^(\S+)$ funktionieren würde, aber das scheint das Wort überhaupt nicht zu entsprechen. Ich habe mit Rubel getestet, http://rubular.com/r/LPEHCnS0ri; Das scheint alle meine Versuche so zu erfüllen, wie ich es möchte, obwohl Java das nicht tut.

Hier ist mein Snippet

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())); 
} 

Diese leicht durch triming den resultierenden String gelöst wird, aber das scheint, wie es unnötig sein sollte, wenn ich bereits einen regulären Ausdruck.

Alle Hilfe wird sehr geschätzt. Danke im Voraus!

+2

'\ s' passt' \ n' unter anderem. –

Antwort

8

Versuchen Sie, die Pattern.MULTILINE Option

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

Dies bewirkt, dass die Regex mit Zeilentrennzeichen in der Zeichenfolge erkennen, sonst ^ und $ nur den Anfang und das Ende der Zeichenfolge übereinstimmen.

Obwohl es keinen Unterschied für dieses Muster macht, die Matcher.group() Methode gibt das gesamte Spiel, während die Matcher.group(int) Methode, um die Übereinstimmung der jeweiligen Capture-Gruppe liefert (...) basierend auf der Zahl, die Sie angeben. Ihr Muster gibt eine Erfassungsgruppe an, die Sie erfassen möchten. Wenn Sie \s in Ihr Muster eingefügt hätten, während Sie es geschrieben haben, dann hätte Matcher.group() dieses Leerzeichen in seinen Rückgabewert eingeschlossen.

+0

Das hat den Trick gemacht. Danke, mir ist nicht klar, dass du mehrere Zeilen angeben musst. –

0

Versuchen Sie, die nächste:

/* 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

mit regulären Ausdrücken die erste Gruppe immer der komplette passende String ist. In Ihrem Fall sollten Sie Gruppe 1, nicht Gruppe 0

So mtch.group()-mtch.group(1) Wechsel sollte es tun:

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

Beat mich dazu. 1+. –

+0

+1 an euch beide für mich zu schlagen :) – anubhava

+0

Das ist gut zu wissen, ich schätze diese Informationen wirklich! –

1

einfach ersetzen:

String result = mtch.group(); 

Von:

String result = mtch.group(1); 

Dies begrenzt Ihre Ausgabe auf den Inhalt der capturing group (z. B. . (\\w+)).

1

Eine späte Antwort, aber wenn Sie nicht Pattern und Matcher verwenden, können Sie diese Alternative von DOTALL in Ihrer Regex String

(?s)[Your Expression] 

Grundsätzlich verwenden (?s) sagt auch Punkt alle Zeichen übereinstimmen, Linie

einschließlich bricht

Detaillierte Informationen: http://www.vogella.com/tutorials/JavaRegularExpressions/article.html

Verwandte Themen