Prendete questa espressione regolare: /^[^abc]/
. Questo corrisponderà a qualsiasi singolo carattere all'inizio di una stringa, eccetto a, b, o c.
Se aggiungete un *
dopo di esso - /^[^abc]*/
- l'espressione regolare continuerà ad aggiungere ogni carattere successivo al risultato, fino a quando non incontrerà o un a
, o b
, o c
.
Per esempio, con la stringa sorgente "qwerty qwerty whatever abc hello"
, l'espressione corrisponderà fino a "qwerty qwerty wh"
.
Ma cosa succede se voglio che la stringa corrispondente sia "qwerty qwerty whatever "
...In altre parole, come posso far corrispondere tutto fino a (ma non incluso) la esatta sequenza "abc"
?
Se state cercando di catturare tutto fino all'abc":
/^(.*?)abc/
Spiegazione:
( )
cattura l'espressione all'interno delle parentesi per l'accesso usando $1
, $2
, ecc.
^
corrisponde all'inizio della linea
.*
corrisponde a qualsiasi cosa, ?
non-greedily (corrisponde al numero minimo di caratteri richiesti) - [1]
[1] La ragione per cui questo è necessario è che altrimenti, nella seguente stringa:
whatever whatever something abc something abc
per impostazione predefinita, le regex sono greedy, il che significa che corrisponderanno il più possibile. Quindi /^.*abc/
corrisponderebbe a "qualunque cosa qualunque qualcosa abc qualcosa ". Aggiungendo il quantificatore non-greedy ?
la regex corrisponde solo a "qualunque cosa qualunque qualcosa ".
Credo che tu abbia bisogno di sottoespressioni. Se ricordo bene si possono usare le normali parentesi ()
per le sottoespressioni.
Questa parte è dal manuale di grep:
Back References and Subexpressions
The back-reference \n, where n is a single digit, matches the substring
previously matched by the nth parenthesized subexpression of the
regular expression.
Fate qualcosa come ^[^(abc)]
dovrebbe fare il trucco.
Il $
segna la fine di una stringa, quindi qualcosa del genere dovrebbe funzionare: [[^abc]*]$
dove stai cercando qualsiasi cosa NON FINIRE in qualsiasi iterazione di abc
, ma dovrebbe essere alla fine
Inoltre se stai usando un linguaggio di scripting con regex (come php o js), hanno una funzione di ricerca che si ferma quando incontra per la prima volta un pattern (e puoi specificare inizio da sinistra o inizio da destra, o con php, puoi fare un implode per specchiare la stringa).