Espressione regolare per trovare la corrispondenza della stringa che inizia con "stop"


97

Come creo un'espressione regolare per trovare una parola all'inizio di una stringa. Stiamo cercando di trovare una corrispondenza stopall'inizio di una stringa e qualsiasi cosa può seguirla.

Ad esempio, l'espressione dovrebbe corrispondere:

stop
stop random
stopping

Grazie.

Risposte:


184

Se desideri far corrispondere solo le righe che iniziano con stop, usa

^stop

Se desideri far corrispondere le righe che iniziano con la parola stop seguita da uno spazio

^stop\s

Oppure, se desideri abbinare le righe che iniziano con la parola stop ma seguite da uno spazio o da qualsiasi altro carattere non alfanumerico che puoi usare (il tuo gusto regex lo consente)

^stop\W

D'altra parte, ciò che segue corrisponde a una parola all'inizio di una stringa nella maggior parte dei gusti di espressioni regolari (in questi gusti \ w corrisponde all'opposto di \ W)

^\w

Se il tuo gusto non ha la scorciatoia \ w, puoi usare

^[a-zA-Z0-9]+

Fai attenzione che questo secondo idioma corrisponderà solo a lettere e numeri, nessun simbolo di sorta.

Controlla il manuale delle espressioni regolari per sapere quali scorciatoie sono consentite e cosa corrispondono esattamente (e come si comportano con Unicode).


27
+1 per generalizzare la tua risposta. Mi piacerebbe vederne di più su Stack Overflow. Lo rende una risorsa di apprendimento migliore secondo me.
Jim il

Come renderlo insensibile alle maiuscole, ad esempio abbinare Stop o stop o sTop?
Elton Garcia de Santana

Dipende dalla tua lingua ... Compatibile con Perl può usare il modificatore I. / regex / i .NET RegexOptions.IgnoreCase e così via
Vinko Vrsalovic

Non dimenticare ^stop\b, che consentirebbe qualsiasi confine, inclusa la fine della linea
Mad Physicist

80

Prova questo:

/^stop.*$/

Spiegazione:

  • / charachters delimitano l'espressione regolare (cioè non fanno parte del Regex di per sé)
  • ^ significa corrispondenza all'inizio della riga
  • . seguito da * significa trovare qualsiasi carattere (.), qualsiasi numero di volte (*)
  • $ significa alla fine della riga

Se desideri imporre che l'interruzione sia seguita da uno spazio bianco, puoi modificare la RegEx in questo modo:

/^stop\s+.*$/
  • \ s indica qualsiasi carattere di spazio bianco
  • + dopo la \ s significa che deve esserci almeno un carattere di spazio vuoto dopo la parola finale

Nota: tieni anche presente che la RegEx sopra richiede che la parola di stop sia seguita da uno spazio! Quindi non corrisponderebbe a una riga che contiene solo: stop


Non tutte le lingue utilizzano le barre in avanti per delimitare le espressioni regolari.
JAB

1
@ Cat Megex: che è precisamente il motivo per cui ho aggiunto la spiegazione. Se la tua lingua usa qualcos'altro per delimitare la regex, sostituisci la / con il carattere appropriato
Mike Dinescu

1
@Mez sì, e tale ridondanza aumenta sia la chiarezza che le prestazioni rexegg.com/regex-optimizations.html#anchors
MarredCheese

28

Se vuoi trovare una corrispondenza dopo una parola, interrompi e non solo all'inizio della riga puoi usare: \bstop.*\b- parola seguita da riga

Parola fino alla fine della stringa

Oppure, se si desidera far corrispondere la parola nell'uso stringa \bstop[a-zA-Z]*- solo le parole che iniziano con arresto

Solo le parole che iniziano con stop

Oppure l'inizio delle righe con stop solo ^stop[a-zA-Z]*per la parola - solo la prima parola
L'intera riga ^stop.*- solo la prima riga della stringa

E se vuoi far corrispondere ogni stringa che inizia con stop includendo le nuove righe usa: /^stop.*/s- stringa multilinea che inizia con stop


19

Come ha detto @SharadHolani. Non corrisponderà a tutte le parole che iniziano con " stop "

. Solo se è all'inizio di una riga come " smetti di andare ". @Waxo ha dato la risposta giusta:

Questo è un po ' meglio, se si vuole adattarsi a qualsiasi parola che inizia con " arresto " e che contiene nulla, ma le lettere da A a Z .

\bstop[a-zA-Z]*\b

Questo corrisponderebbe a tutto

stop (1)

stop random (2)

arresto (3)

voglio smettere (4)

per favore smettila (5)

Ma

/^stop[a-zA-Z]*/

corrisponderebbe solo a (1) fino a (3), ma non (4) e (5)


8
/stop([a-zA-Z])+/

Corrisponderà a qualsiasi parola di arresto (arresto, interrotto, arresto, ecc.)

Tuttavia, se vuoi solo far corrispondere "stop" all'inizio di una stringa

/^stop/

farà: D


2
Questo corrisponderà a "non smettere di andare"
Alex B

1
Questo non corrisponderà a stop123 o stop ,.
Lostintranslation

7

Se vuoi far corrispondere tutto ciò che inizia con "stop", inclusi "stop going", "stop" e "stop", usa:

^stop

Se vuoi trovare la parola stop seguita da qualsiasi cosa come in "stop going", "stop this", ma non "stop" e non "stop" usa:

^stop\W

0

Sconsiglierei un semplice approccio con espressioni regolari a questo problema. Ci sono troppe parole che sono sottostringhe di altre parole non correlate, e probabilmente ti farai impazzire cercando di adattare le soluzioni più semplici già fornite.

Avrai bisogno almeno di un algoritmo di stemming ingenuo (prova lo stemmer di Porter; c'è codice disponibile e gratuito nella maggior parte delle lingue) per elaborare prima il testo. Mantieni questo testo elaborato e il testo preelaborato in due matrici separate in spazi separati. Assicurati che ogni carattere non alfabetico abbia anche il proprio indice in questo array. Qualunque sia l'elenco di parole che stai filtrando, stemperalo anche.

Il passo successivo sarebbe trovare gli indici dell'array che corrispondono al tuo elenco di parole "stop" con radice. Rimuovere quelli dall'array non elaborato e quindi ricongiungersi agli spazi.

Questo è solo leggermente più complicato, ma sarà un approccio molto più affidabile. Se hai dei dubbi sul valore di un approccio più orientato alla PNL, potresti voler fare qualche ricerca sugli errori clbuttici .


0

Se vuoi che la parola inizi con "stop", puoi utilizzare il seguente schema. "^fermare.*"

Ciò corrisponderà alle parole che iniziano con stop seguite da qualsiasi cosa.


1
Non potresti semplicemente usare "^stop"?
Stephen Rauch

Dipende. Mentre parliamo in termini di sintassi java, possiamo usare Pattern e Matcher per usare regex o usare direttamente il metodo .matches () con l'oggetto String. Differiscono nel risultato come di seguito: code String line = "stopped"; String pattern = "^stop"; Pattern r = Pattern.compile(pattern); Matcher m = r.matcher(line); System.out.println(m.find( )); //prints true System.out.println(line.matches(pattern)); //prints false
Manisha Chaurasia

1
Questo corrisponde solo se la parola all'inizio della riga. Se le parole che iniziano con "stop" si trovano a metà riga o alla fine, questa regex non corrisponderà. @StephenRauch se ometti [az] * non otterrai parole come "stop" per intero. In caso di "arresto" si ottiene "stop" e "ping" mancherebbe.
Sedat Kilinc
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.