2017-01-25 2 views
0

ich eine Regex will Zeichenfolge zwischen zwei Zeichen zu finden, aber nur von Startdelimiter bis zum ersten Auftreten von EndebegrenzersRegexMuster Zeichenfolge zwischen zwei Zeichen für die Suche nach - aber die erste Vorkommens des zweiten Zeichens

ich Geschichte extrahieren möchte aus die Linien der folgenden Format

<metadata name="user" story="{some_text_here}" \/> 

Deshalb möchte ich nur extrahieren: {some_text_here}

Dafür habe ich die folgende regex bin mit:

<metadata name="user" story="(.*)" \/> 

und Java-Code:

public static void main(String[] args) throws IOException { 
     String regexString = "<metadata name="user" story="(.*)" \/>"; 
     String filePath = "C:\\Desktop\\temp\\test.txt"; 
     Pattern p = Pattern.compile(regexString); 
     Matcher m; 
     try (BufferedReader br = new BufferedReader(new FileReader(filePath))) { 
      String line; 
      while ((line = br.readLine()) != null) { 
       m = p.matcher(line); 
       if (m.find()) {      
        System.out.println(m.group(1)); 
       } 
      } 
     } 

    } 

Diese Regex meist funktioniert gut, aber überraschend, wenn die Linie ist:

<metadata name="user" story="My name is Nick" extraStory="something" /> 

Ausführen der Code auch My name is Nick" extraStory="something filtert, wo ich nur sicherstellen möchten, dass ich bekomme My name is Nick

Auch ich möchte sicherstellen, dass es tatsächlich keine Informationen zwischengibtund vor />

+2

[Pflichtlink] (http://stackoverflow.com/a/1732454/2071828). –

+2

Sie möchten den Quantifizierer nicht gierig machen oder das Endzeichen ausschließen. –

+3

Was Sie brauchen, ist ein kontextsensitiver Parser, der Regex nicht ist. – Aaron

Antwort

1
<metadata name="user" story="([^"]*)" \/> 

[^ "] * wird alles außer dem überein". In diesem Fall wird die Zeichenfolge

nicht übereinstimmen.

+0

Arbeitete wie ein Zauber mein Freund, danke. –

0

Verwenden Sie einfach Jsoup. richtiges Werkzeug für das Problem :).

seine einfach geht es:

String html; //read html file 

Document document = Jsoup.parse(html); 

String story = document.select("metadata[name=user]").attr("story"); 

System.out.println(story); 
+0

Ich bin mir nicht sicher, ob es das richtige Werkzeug ist, ich denke es ist übertrieben 1) wenn die Quelle wohlgeformte XML Daten sind und 2) der Benutzer sich nicht schon mit CSS/jquery Selector Abfragen auskennt. – Aaron

+0

Aber würde es nicht eine Zeichenkette lesen, die ungültiges attr enthält, d. H. Eine Zeile, die extraStory enthält. Das ist für mich auch eine Einschränkung, dass die Zeile nichts anderes als den Namen und das Story-Tag enthalten sollte. –

+0

@Aaron könnte immer etwas langsamer sein, aber seine Einfachheit ist es wert. ein Ein-Liner-Code. Sie können nicht einfacher – nafas

1

Die folgende XPath Ihr Problem lösen sollte:

//metadata[@name='user' and @story and count(@*) = 2]/@story 

Es adressieren die story Attribut von jedem metadata Knoten in dem Dokument, dessen name Attribut ist user, die auch hat ein story Attribut, aber keine anderen (Attributanzahl ist 2).

(Anmerkung: //metadata[@name='user' and count(@*)=2]/@story wäre genug, da es unmöglich wäre, die story Attribut eines metadata Knoten, dessen zweite Attribut ist nicht story Adresse)

In Java-Code, unter der Annahme Sie eine Instanz von org.w3c.dom.Document sind Handling und bereits eine Instanz von XPath zur Verfügung haben, würde der Code wie folgt vor:

xPath.evaluate("//metadata[@name='user' and @story and count(@*) = 2]/@story", xmlDoc); 

Sie können versuchen, den XPath here oder den Java-Code here.

+0

'extraStory "War nur ein Beispiel. Tut mir leid, wenn ich nicht klar war. Es ist ungültig, wenn es etwas anderes als 'name' und 'story' hat, also würde 'extraStory' die Zeile ungültig machen, 'extraStory1' würde es ungültig machen, 'xyz' würde es auch ungültig machen. –

+0

@NickDiv Ich habe den XPath-Ausdruck aktualisiert, um sicherzustellen, dass die einzigen beiden Attribute 'name' und' story' sind. – Aaron

+0

vielen Dank. Schätze die Hilfe. Würde das definitiv ausprobieren. –

Verwandte Themen