2017-01-06 2 views
3

Ich versuche, eine Zeichenfolge mit Regular Expression zu analysieren. Ich habe einen Inhaltstext: Text und ich möchte den Inhalt von einer Schnur analysieren, die Text: Text hat. Code:Analysieren einer Zeichenfolge mit Regulärer Ausdruck in Java

String lines=" from:cal_date_d type:string relationship:many_to_one sql_on:${fact_customer.dw_update_date} = ${cal_date_d.dw_update_date}"; 
Pattern p = Pattern.compile("(\"?[\\w ]*)\\:(\"?([\\w]*)\"?)"); 
       Matcher m = p.matcher(lines); 
       while(m.find()) { 
        String Column_Data=m.group(0); 
        System.out.println("Regex:   "+Column_Data); 
       } 

Ouput:

from:cal_date_d 
type:string 
relationship:many_to_one 
sql_on: 

Erwartete Ausgabe:

from:cal_date_d 
type:string 
relationship:many_to_one 
sql_on:${fact_customer.dw_update_date} = ${cal_date_d.dw_update_date} 
+0

Das erste Problem ist, dass der Wert nicht nur Wort-Zeichen enthalten, sondern auch die Dollarzeichen, Klammern, das Gleichheitszeichen, Punkte und Leerzeichen. Das größere Problem besteht darin, dass Leerzeichen normalerweise Schlüssel: Wert-Paare trennen, aber innerhalb des Wertes "sql_on" enthalten sein können. Wie lautet die Syntax von 'sql_on'? Wird es immer eine enge Klammer und ein Gleichheitszeichen vor den inneren Räumen haben? Wird 'sql_on' immer erscheinen und zuletzt erscheinen? Sie brauchen einen anderen Aspekt, um sich darauf zu stützen oder einen anderen Ansatz zu wählen. –

+0

für Sql_on Schlüssel, das Muster ist das gleiche und Standard die ganze Zeit – Navyah

Antwort

2

Versuchen Sie, diese Muster

([^\s]+(?= ?[^\s]*)?) 

https://regex101.com/r/c0q4W0/2

+1

Danke, es hat funktioniert. Aber ich bekomme zusätzlich eine leere Zeichenfolge. Aber das ist in Ordnung, ich kann das analysieren, indem ich die Länge der Zeichenfolge überprüfe. – Navyah

+2

@Navyah Vielleicht ändern Sie es, um eine oder mehrere ('+') anstelle von null oder mehr ('*') Zeichen zu verlangen. –

+2

@DavidConrad Das ist richtig. Es war ein Tippfehler. Jetzt geändert – RaR

0

Wenn Sie Zeichenfolge wie "key1:value1 key2:value2..." haben, dann können Sie diese Regex verwenden:

([^ ]*:[^ ]*)

+1

Aber OP hat keine Zeichenfolge wie diese, da der letzte Wert Leerzeichen enthält (um das Gleichheitszeichen). –

+1

Oh, ich verstehe. In diesem Fall ist es nicht möglich zu parsen, weil Leerzeichen ein Trennzeichen zwischen Schlüssel/Wert-Paaren ist und das letzte Paar Leerzeichen um "=" hat, wie Sie bereits erwähnt haben. –

+0

@Dmitry, Verwenden des folgenden Musters. Ich bekomme das Ergebnis wie folgt: cal_date_d typ: string beziehung: many_to_one sql_on: $ {fact_customer.dw_update_date} – Navyah

Verwandte Themen