Risposte:
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), o
e 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.
?:
interno di un raggruppamento aka non-capturing
dice semplicemente che non puoi usare le espressioni con corrispondenza $1
, $2
e così via ... Se vuoi che un'espressione non sia abbinata, ciò di cui hai bisogno è ^
.
(?! ... )
insead, che significa (?!s|season)
in questo caso.
Schermata sopra presa da questo esempio dal vivo: https://regex101.com/r/cU5lC2/1
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
, $content2
e $content3
con il (\w)+
modello.
$ content1 e $ content2 contengono almeno una parola, $ content3 no.
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 gun1
e gun2
contengono la stringa dart
o fart
che è corretta, ma gun3 contiene darty
e corrisponde ancora, questo è il problema. Quindi al prossimo esempio.
I confini delle parole possono essere forzati con \b
, vedere:
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' \b
asserisce che abbiamo un confine di parola, assicurandoci che "dardo" sia abbinato, ma "darty" non lo è.
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
[ ]
definisce una classe di caratteri. Quindi ogni personaggio che hai impostato lì, corrisponderà. [012]
corrisponderà a 0
o 1
o 2
e [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.
(season|s)
invece.[season]
corrisponde a qualsiasi dis
,e
,a
,o
,n
.