Java regex: lookahead Negativo

Sto cercando di realizzare due espressioni regolari che corrispondono di Uri. Questi gli Uri sono di formato: /foo/someVariableData e /foo/someVariableData/bar/someOtherVariableData

Ho bisogno di due espressioni regolari. Ciascuno deve corrispondere a uno ma non l’altro.

Le espressioni regolari inizialmente si avvicinò con sono:
/foo/.+ e /foo/.+/bar/.+ rispettivamente.

Penso che la seconda espressione regolare è la fine. Sarà solo la seconda stringa. Il primo regex, tuttavia, corrisponde a entrambe. Così, ho iniziato a giocare (per la prima volta) con lookahead negativo. Ho progettato la regex /foo/.+(?!bar) e impostare il codice riportato di seguito per verificare che

public static void main(String[] args) {
    String shouldWork = "/foo/abc123doremi";
    String shouldntWork = "/foo/abc123doremi/bar/def456fasola";
    String regex = "/foo/.+(?!bar)";
    System.out.println("ShouldWork: " + shouldWork.matches(regex));
    System.out.println("ShouldntWork: " + shouldntWork.matches(regex));
}

E, naturalmente, entrambi di risolvere in true.

Qualcuno sa di cosa sto facendo di sbagliato? Non ho bisogno di utilizzare lookahead Negativo, necessariamente, ho solo bisogno di risolvere il problema, e penso che lookahead negativo, potrebbe essere un modo per farlo.

Grazie,

InformationsquelleAutor Cody S | 2012-06-20

 

One Reply
  1. 60

    Provare

    String regex = "/foo/(?!.*bar).+";

    o, eventualmente,

    String regex = "/foo/(?!.*\\bbar\\b).+";

    per evitare errori su percorsi come /foo/baz/crowbars che presumo tu vuoi che regex per corrispondenza.

    Spiegazione: (senza il doppio backslash richiesto da stringhe Java)

    /foo/ # Match "/foo/"
    (?!   # Assert that it's impossible to match the following regex here:
     .*   #   any number of characters
     \b   #   followed by a word boundary
     bar  #   followed by "bar"
     \b   #   followed by a word boundary.
    )     # End of lookahead assertion
    .+    # Match one or more characters

    \b, il “confine di parola di ancoraggio”, corrisponde lo spazio vuoto tra un carattere alfanumerico e un carattere non alfanumerico (o tra l’inizio e la fine della stringa e un alnum carattere). Quindi, partite prima della b o dopo il r in "bar", ma non corrispondenza tra w e b in "crowbar".

    Protip: date un’occhiata a http://www.regular-expressions.info – un grande regex tutorial.

    • Il .* interni lookahead negativo espressione: (?!.*bar) è la chiave qui, piuttosto che fuori: .*(?!bar). Grazie.

Lascia un commento