2016-08-02 8 views
3

Ich brauche eine Regex, um die Suche in Eclipse nach allen Strings, die mit $ {und enden mit} beginnen, sollte jedoch pageContext zwischen den beiden nicht haben. Für BeispielRegex Um Zeichenfolge beginnend und endend mit Zeichen

$ {requestScope.user}

$ {sessionScope.user}

sollte

aber $ {} pageContext.request sollte nicht

entsprechen

Nach allen Bemühungen habe ich diese Regex gemacht (\ $ {) die mit Strings beginnt beginnend mit $ { aber einige wie nicht meine Anforderung erfüllt. Jede Hilfe wird geschätzt.

Antwort

2

Sie können eine negative Vorschau verwenden spezielle Begegnungen auszuschließen:

\$\{(?!pageContext\.).*?\} 
    ^^^^^^^^^^^^^^^^ 

Die (?!pageContext\.) Look-Ahead wird alle Spiele scheitern, wo { mit pageContext. folgt. Sie können auch [^{}]* anstelle von .*? verwenden.

Siehe regex demo

Muster Details:

  • \$ - eine wörtliche $
  • \{ - eine wörtliche {
  • (?!pageContext\.) - das Spiel fehl, wenn ein pageContext. die { sofort folgt
  • ly
  • .*? - alle 0+ andere Zeichen als eine neue Zeile (oder [^{}]* - null oder mehr andere Zeichen als { und })
  • \} - ein Literal }.

HINWEIS:

Wenn Sie ${...} String mit pageContext.überall Inneren passend vermeiden müssen, verwenden

\$\{(?![^{}]*pageContext\.)[^{}]*\} 
    ^^^^^^^^^ 

Hier ist die [^{}]* in der Look-Ahead für pageContext. aussehen nach irgendwelchen 0+ Zeichen außer { und }.

+0

Vielen Dank, es funktioniert, aber es ist die gesamte Zeichenfolge auswählen, was, wenn ich nur $ und mit der obigen Bedingung Nein die gesamte Zeichenfolge auswählen möchten –

+0

@Mckenzie Diese Regex stimmt tatsächlich nichts überein, was bedeutet was auch immer du durchläufst, gibt dir die übereinstimmende Zeichenkette zurück, abhängig davon, wie deine Regex verwendet wird. Das Hinzufügen eines Captures kann und darf nichts machen, aber du * kannst * die Übereinstimmung dadurch erfassen: '(\ $ \ { (?! pageContext \.). *? \}) ' –

+1

@Mckenzie: Es ist zwar möglich,' $ {'nicht gefolgt von' pageContext' mit '\ $ \ {(?! pageContext \.)', zu vergleichen Es ist nicht möglich, Eclipse-Regex-Engine zu verwenden, um '}' zu entsprechen, das nicht mit {{pageContext." vorangestellt ist, da es Lookwheh mit unendlicher Breite nicht unterstützt. –

0

Look ahead oder Blick hinterher sind teuer.Sie sollten das optionale Spiel Trick bevorzugen:

\$\{(?:.*pageContext.*|(.*))\} 

Live Example

Um Verwirrung zu vermeiden, lassen Sie mich geben, dass dies Spiel eine beliebige Zeichenfolge mit einem „$ {“ Präfix und ein „}“ Suffix, aber wenn Dieser String enthielt "pageContext". Der Capture-Wert ist 1 st leer. Wenn die 1 st Aufnahme nicht leer ist, haben Sie eine Zeichenfolge, die Ihren Kriterien entspricht.

+0

Seine Auswahl $ {pageContext.request} auch, aber es shud nicht –

+0

@Mckenzie Wie Sie aus dem Live-Beispiel sehen können, ist es * nicht erfassen * "$ {pageContext.request}" das wird nur * erfassen * wenn es ist ein Spiel. Wie nutzen Sie die Ergebnisse dieser Regex? –

+0

Nun, Backtracking ist teurer als jeder verankerte Lookahead wie meiner. 64 Schritte (meins) (oder 30 mit der negierten Zeichenklasse) vs. 110 (deins) mit demselben Inhalt. –

Verwandte Themen