Regex: abbinamento fino alla prima occorrenza di un personaggio


358

Sto cercando un modello che corrisponda a tutto fino alla prima occorrenza di un personaggio specifico, dire un ";" - un punto e virgola .

Ho scritto questo:

/^(.*);/

Ma in realtà corrisponde a tutto (incluso il punto e virgola) fino all'ultima occorrenza di un punto e virgola.


65
/^(.*?);/dovrebbe anche funzionare (si chiama non avido ), ma le risposte fornite usando [^;]*sono migliori.
Pascal,

come selezioneresti tutto, dopo il punto e virgola, e non il punto e virgola stesso.
Muhammad Umer,

vedi che funziona \w+(?!([^]+;)|;)ma non è per questo? .+(?!([^]+;)|;)
Muhammad Umer,

1
Pascal, avresti dovuto scriverlo come una risposta!
Sean Kendle,

@Pascal Questo è adatto come risposta! Grazie!
neverMind9

Risposte:


503

Hai bisogno

/[^;]*/

Il [^;]è una classe di caratteri , abbina tutto, ma un punto e virgola.

Per citare la perlremanpage:

È possibile specificare una classe di caratteri, racchiudendo un elenco di caratteri in [], che corrisponderà a qualsiasi carattere dell'elenco. Se il primo carattere dopo "[" è "^", la classe corrisponde a qualsiasi carattere non presente nell'elenco.

Questo dovrebbe funzionare nella maggior parte dei dialetti regex.


La grande parte di questa soluzione è che corrisponde anche alla fine della linea, ad esempio nel mio caso che avevo foo=bar;baz=bax;bab=bafe corrispondeva bab=bafanche se non c'è ;esattamente quello di cui ho bisogno. Non sono sicuro del motivo per cui funziona se le specifiche dicono che corrisponde a tutto tranne che al simbolo target ...
skryvets


38

/^[^;]*/

Il [^;] dice abbina qualsiasi cosa tranne un punto e virgola. Le parentesi quadre sono un operatore di corrispondenza del set, è essenzialmente, abbinano qualsiasi carattere in questo set di caratteri, ^all'inizio lo rende una corrispondenza inversa, quindi abbina qualsiasi cosa non in questo set.


3
Ricorda che il primo ^ in questa risposta dà alla regex un significato completamente diverso: fa sì che l'espressione regolare cerchi solo le corrispondenze a partire dall'inizio della stringa. In questo caso, sarebbe effettivamente una scelta negativa se si esegue l'espressione regolare solo una volta. Se vuoi cercare più corrispondenze all'interno di una singola stringa, la prima ^ dovrebbe andare.
Dan Breslau,

4
Ha detto che voleva abbinare tutto fino alla prima occorrenza di un punto e virgola, quindi ho pensato che intendesse dall'inizio della stringa.
Glenn Slaven,



8

testo di esempio:

"this is a test sentence; to prove this regex; that is g;iven below"

Se per esempio abbiamo il testo di esempio sopra, regex /(.*?\;)/ti darà tutto fino alla prima occorrenza del punto e virgola ( ;), incluso il punto e virgola:"this is a test sentence;"


3
non è necessario sfuggire al ;carattere perché non è un carattere speciale regex. Anche il raggruppamento ()non è richiesto. Puoi andare con/.*?;/
Aliaksei Kliuchnikau il

1
si, hai ragione. la fuga era più simile a "meglio prevenire che curare"
poncius

2
Questa è la risposta che stavo cercando. Così la ? fa terminare la partita alla prima occorrenza? Come si chiama questa proprietà ... (chiamiamola così) della regex?
Parziphal,

1
@Parziphal il ?personaggio rende pigro il match (abbinando il minor numero di volte possibile). Pensa ai regex che corrispondono ai personaggi fino al primo punto e virgola, quindi non va oltre perché si arrende (pigro;))
derekantrican

5

questa non è una soluzione regex, ma qualcosa di abbastanza semplice per la descrizione del problema. Basta dividere la stringa e ottenere il primo elemento dall'array.

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

produzione

$ php test.php
match everything until first

5

Questo è stato molto utile per me mentre stavo cercando di capire come abbinare tutti i caratteri in un tag xml inclusi gli attributi. Stavo incontrando il problema "abbina tutto alla fine" con:

/<simpleChoice.*>/

ma è stato in grado di risolvere il problema con:

/<simpleChoice[^>]*>/

dopo aver letto questo post. Ringrazia tutti.


1
Avevo scoperto che è molto più efficiente analizzare (ogni linguaggio o framework ha le sue classi per questo) html / xml a causa del suo formato macchina, i regex sono per il linguaggio naturale.
Leon Fedotov,

1
Bello. Ho usato questo per correggere documenti XML con errori di sintassi nel <!DOCTYPE>tag. Dal momento che il parser non è stato in grado di gestirlo.
Martin Schneider,

5

Ciò corrisponderà alla prima occorrenza solo in ciascuna stringa e ignorerà le occorrenze successive.

/^([^;]*);*/

3

"/^([^\/]*)\/$/" ha funzionato per me, per ottenere solo le "cartelle" migliori da un array come:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this

2

Davvero un po 'triste che nessuno ti abbia dato la risposta corretta ....

In regex,? lo rende non avido. Di default regex corrisponderà il più possibile (goloso)

Aggiungi semplicemente un? e non sarà avido e si abbinerà il meno possibile!

Buona fortuna, spero che ti aiuti.


3
Ciò dipende in larga misura dall'attuale implementazione regex e non tutte le implementazioni hanno modalità non avide.
Karatedog,

0

l'ho trovato

/^[^,]*,/

funziona bene.

',' essendo il "delimitatore" qui.

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.