2012-11-08 7 views
5

Ich bin ein Noob Regex.

Ich habe String wie: -

String str = "sbs 01.00 sip ${dreamworks.values} print ${fwVer} to 
       used ${lang} en given ${model} in ${region}"; 

und ich habe alle Muster mit dieser Art $ angepasst extrahieren {....}

wie: - für gegebene str Ergebnis

sein sollte
${dreamworks.values} 
${fwVer} 
${lang} 
${model} 
${region} 

weiter, wenn es irgendwelche Duplikate findet, dann gibt es nur einen. für die Ex: -

String feed = "sip ${dreamworks.values} print ${fwVer} to ${fwVer} used 
       ${lang} en ${lang}given ${model} in ${region}" 

Ergebnis sein sollte: -

${dreamworks.values} 
${fwVer} 
${lang} 
${model} 
${region} 

nur

das ist meine Antwort: -

PLACEHOLDER_PATTERN = "\\$\\{\\w+\\}"; 

aber diese nicht das richtige Ergebnis zu geben . es gibt nur

${fwVer} 
${lang} 
${model} 
${region} 

Also mir bitte vorschlagen richtige regex.

+1

weil "dreamworks.values" enthält a. drin –

Antwort

6

Sie denken nicht an die . zwischen dem Wort. \\w enthält nicht die dot(.).

Sie benötigen Muster zu ändern: -

PLACEHOLDER_PATTERN = "\\$\\{.+?\\}"; 

dot(.) alles passt, und das ist, was Sie mit der rechten wollen?

Auch habe ich hier verwendete reluctant quantifier - .+?, so dass es nur die erste } nach { übereinstimmt, da, wenn Sie einen gierigen Quantor verwenden (.+), dot(.) wird auch die } in der Art und Weise entsprechen, bis es die letzte } findet.


UPDATE: -

nur die einzigartigen Werte zu erhalten, können Sie dieses Muster verwenden: -

"(\\$\\{[^}]+\\})(?!.*?\\1)" 

Es wird nur jene Muster entsprechen, die gefolgt wird von der Zeichenfolge, die das gleiche Muster enthält.

HINWEIS: - Hier habe ich [^}] anstelle von .+? verwendet. Es passt zu jedem Zeichen außer }. In diesem Fall benötigen Sie keinen reluctant Quantifizierer.

\1 für backreferencing verwendet, aber wir müssen es mit einem Backslash zu entkommen und damit \\1 und (?!...) für negative look ahead verwendet wird.

+0

Aber was ist mit String-Feed? Wie bekomme ich einzigartige Werte? – user1808653

+0

Was ist das "String feed"? Kannst du etwas mehr erklären? –

+0

String feed = "sip $ {dreamworks.values} drucken $ {fwVer} bis $ {fwVer} verwendet $ {lang} en $ {lang} gegeben $ {modell} in $ {region}"; Bitte beachten Sie den anderen Fall für doppelte String-Feed in diesem Beispiel. – user1808653

1

Das ist, weil die . nicht in \w enthalten ist. Sie müssen dann Ihre eigene character class erstellen und sie dort hinzufügen.

PLACEHOLDER_PATTERN = "\\$\\{[\\w.]+\\}"; 

Siehe das Muster here on Regexr.

Dies löst jedoch nicht das Problem, dass Sie keine Duplikate wollen, aber das ist kein Job für reguläre Ausdrücke.

Wenn zwischen den geschweiften Klammern mehrere Zeichen stehen könnten, dann ist Rohits answer besser, das würde alle Zeichen bis zur schließenden Klammer entsprechen.

+0

unescaped '.' passt auch schließende Klammern mit deinem gierigen Quantifizierer ... – jlordo

+1

@jlordo, nicht innerhalb einer Zeichenklasse. Da ist ein Punkt nur ein Punkt und nichts besonderes. – stema

+0

@stem - du hast Recht, danke für deine Antworten, lerne jeden Tag neue Dinge über SO :) – jlordo

Verwandte Themen