Domanda

Sto cercando una regex che corrisponda a una stringa che inizia con una sottostringa e non termina con una determinata sottostringa.

Esempio:

// Updated to be correct, thanks @Apocalisp
^foo.*(?<!bar)$

Dovrebbe corrispondere a tutto ciò che inizia con "foo" e non termina con "bar".Conosco la sintassi [^...], ma non riesco a trovare nulla che lo faccia per una stringa anziché per singoli caratteri.

Sto provando specificamente a farlo per la regex di Java, ma mi sono già imbattuto in questo modo, quindi anche le risposte per altri motori regex sarebbero fantastiche.

Grazie a @Kibbee per aver verificato che funzioni anche in C#.

È stato utile?

Soluzione

Penso che in questo caso tu voglia guardare indietro negativo, così:

foo.*(?<!bar)

Altri suggerimenti

Verificata la risposta di @Apocalisp utilizzando:

import java.util.regex.Pattern;
public class Test {
  public static void main(String[] args) {
    Pattern p = Pattern.compile("^foo.*(?<!bar)$");
    System.out.println(p.matcher("foobar").matches());
    System.out.println(p.matcher("fooBLAHbar").matches());
    System.out.println(p.matcher("1foo").matches());
    System.out.println(p.matcher("fooBLAH-ar").matches());
    System.out.println(p.matcher("foo").matches());
    System.out.println(p.matcher("foobaz").matches());
  }
}

Questo produce le risposte giuste:

false
false
false
true
true
true

Non ho familiarità con le espressioni regolari Java ma con la documentazione per il file Classe modello suggerirei di poter utilizzare (?!X) per un lookahead negativo a larghezza zero che non cattura (cerca qualcosa che non è X in quella posizione, senza catturarlo come riferimento all'indietro).Quindi potresti fare:

foo.*(?!bar) // not correct

Aggiornamento:Apocalisp ha ragione, vuoi un lookbehind negativo.(stai verificando che ciò che corrisponde a .* non termini con barra)

Come hanno detto altri commentatori, è necessario uno sguardo al futuro negativo.In Java puoi usare questo modello:

"^first_string(?!.?second_string)\\z"
  • ^ - assicura che la stringa inizi con First_string
  • \z - garantisce che la stringa termini con second_string
  • (?!.?second_string) - significa che first_string non può essere seguito da second_string
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top