Espressione regolare per trovare una parola o il suo prefisso


119

Voglio abbinare un'espressione regolare su una parola intera.

Nel seguente esempio che sto cercando di abbinare so seasonma quello che ho partite s, e, a, oe n.

[s|season]

Come faccio a creare un'espressione regolare per trovare una parola intera?


4
Usa (season|s)invece. [season]corrisponde a qualsiasi di s, e, a, o, n.
falsetru

Risposte:


137

Le parentesi quadre sono pensati per classe di caratteri, e si sta effettivamente cercando di abbinare uno dei: s, |, s(ancora una volta), e, a, s(di nuovo), oe n.

Usa invece le parentesi per raggruppare:

(s|season)

o gruppo non di cattura:

(?:s|season)

Nota: i gruppi non di acquisizione dicono al motore che non ha bisogno di memorizzare la corrispondenza, mentre l'altro (il gruppo di acquisizione lo fa). Per le piccole cose, entrambi funzionano, per le cose "pesanti", potresti voler vedere prima se hai bisogno della corrispondenza o meno. In caso contrario, è meglio utilizzare il gruppo di non acquisizione per allocare più memoria per il calcolo invece di memorizzare qualcosa che non sarà mai necessario utilizzare.


Sì, l'avevo capito. La non cattura era ciò di cui avevo bisogno. Pensavo che l'uso di () corrispondesse sempre, sapere che esiste un'opzione per non corrispondere è utile, grazie.
NMGod

Hai capito male. L' ?:interno di un raggruppamento aka non-capturingdice semplicemente che non puoi usare le espressioni con corrispondenza $1, $2e così via ... Se vuoi che un'espressione non sia abbinata, ciò di cui hai bisogno è ^.
EverythingRightPlace

@ NMGodA1b2c3d4 Prego! Intendi un'opzione per non abbinare o catturare (c'è una differenza, sì). Se non vuoi abbinare nessuno di questi, userai (?! ... )insead, che significa (?!s|season)in questo caso.
Jerry

126

Usa questo esempio online dal vivo per testare il tuo modello:

inserisci qui la descrizione dell'immagine

Schermata sopra presa da questo esempio dal vivo: https://regex101.com/r/cU5lC2/1

Corrispondenza di qualsiasi parola intera sulla riga di comando.

Sarò utilizzando la shell interattiva phpsh su Ubuntu 12.10 dimostrare il motore PCRE regex attraverso il metodo noto come preg_match

Avvia phpsh, inserisci alcuni contenuti in una variabile, abbina parole.

el@apollo:~/foo$ phpsh

php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'

php> echo preg_match('(\w+)', $content1);
1

php> echo preg_match('(\w+)', $content2);
1

php> echo preg_match('(\w+)', $content3);
0

Il metodo preg_match utilizzato il motore PCRE all'interno del linguaggio PHP per analizzare le variabili: $content1, $content2e $content3con il (\w)+modello.

$ content1 e $ content2 contengono almeno una parola, $ content3 no.

Abbina una parola specifica sulla riga di comando senza limiti di parole

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(dart|fart)', $gun1);
1

php> echo preg_match('(dart|fart)', $gun2);
1

php> echo preg_match('(dart|fart)', $gun3);
1

php> echo preg_match('(dart|fart)', $gun4);
0

Variabili gun1e gun2contengono la stringa darto fartche è corretta, ma gun3 contiene dartye corrisponde ancora, questo è il problema. Quindi al prossimo esempio.

Abbina parole specifiche sulla riga di comando con i confini delle parole:

I confini delle parole possono essere forzati con \b, vedere: Analisi visiva di ciò che wordboundary sta facendo da jex.im/regulex

Immagine visiva Regex acquisita da http://jex.im/regulex e https://github.com/JexCheng/regulex Esempio:

el@apollo:~/foo$ phpsh

php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'darty gun';
php> $gun4 = 'unicorn gun';

php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1

php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0

php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0

L' \basserisce che abbiamo un confine di parola, assicurandoci che "dardo" sia abbinato, ma "darty" non lo è.


3
votato positivamente perché avevo bisogno del carattere \ b e non lo sapevo!
Nieminen

Perché questa spiegazione approfondita non è la risposta?
dewwwald

1
Perché la persona che ha pubblicato la domanda ha selezionato la prima risposta che è arrivata e non si è preoccupata di passare alla mia quando la mia risposta di gran lunga superiore è arrivata più tardi. Puoi chiedere all'interrogante tramite il commento sotto la domanda di cambiare la selezione della risposta in questa, e migliorerebbe il valore di questa pagina per le persone che vi arrivano.
Eric Leschinski

1
Ho votato contro perché hai usato la parola "scoreggia" nel tuo esempio ... e avevo bisogno di \ w +;)
SomethingOn


4

Provo esempi in js. Soluzione più semplice: aggiungi semplicemente la parola di cui hai bisogno all'interno / /:

var reg = /cat/;
reg.test('some cat here');//1 test
true // result
reg.test('acatb');//2 test
true // result

Ora, se hai bisogno di questa parola specifica con confini, non all'interno di altri segni-lettere. Usiamo il pennarello b :

var reg = /\bcat\b/
reg.test('acatb');//1 test 
false // result
reg.test('have cat here');//2 test
true // result

Abbiamo anche il metodo exec () in js, che restituisce il risultato dell'oggetto. Aiuta fg per ottenere informazioni sul luogo / indice della nostra parola.

var matchResult = /\bcat\b/.exec("good cat good");
console.log(matchResult.index); // 5

Se abbiamo bisogno di ottenere tutte le parole corrispondenti in stringa / frase / testo, possiamo usare il modificatore g (corrispondenza globale):

"cat good cat good cat".match(/\bcat\b/g).length
// 3 

Ora l'ultimo - non ho bisogno di 1 parola specifica, ma di alcune di esse. Usiamo | segno, significa scelta / o.

"bad dog bad".match(/\bcat|dog\b/g).length
// 1

2

[ ]definisce una classe di caratteri. Quindi ogni personaggio che hai impostato lì, corrisponderà. [012]corrisponderà a 0o 1o 2e [0-2]si comporta allo stesso modo.

Quello che vuoi sono raggruppamenti per definire un'istruzione or. Usa (s|season)per il tuo problema.

Btw. devi stare attento. I metacaratteri nella normale regex (o all'interno di un raggruppamento) sono diversi dalla classe di caratteri. Una classe di caratteri è come una lingua secondaria. [$A]corrisponderà solo $o A, nient'altro. Nessuna fuga qui per il dollaro.

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.