/^.*?\bcat\b.*?\bmat\b.*?$/m
Uso della m
modificatore (che garantisce la partita metacharacters inizio/fine sulla linea rompe piuttosto che proprio all'inizio e alla fine della stringa):
^
abbinamento la riga che inizia
.*?
corrisponde a qualsiasi elemento sulla linea prima ...
\b
corrisponde ad un limite di parola la prima occorrenza di un limite di parole (come discusso @codaddict)
- quindi la stringa
cat
e un altro limite di parola; si noti che i caratteri di sottolineatura vengono considerati come caratteri "word", quindi _cat_
sarebbe non corrispondenza *;
.*?
: tutti i caratteri prima di ...
- confine,
mat
, confine
.*?
: eventuali caratteri rimanenti prima di ...
$
: la fine della linea.
E 'importante utilizzare \b
per assicurare le parole specificate non fanno parte di parole più lunghe, ed è importante utilizzare i caratteri jolly non avidi (.*?
) contro avidi (.*
) perché quest'ultimo avrebbe fallire su stringhe come " C'è un gatto in cima al tappeto che si trova sotto il gatto. " (E sarebbe partita l'ultima occorrenza di "gatto", piuttosto che il primo.)
* Se si vuole essere in grado di eguagliare _cat_
, è possibile utilizzare:
/^.*?(?:\b|_)cat(?:\b|_).*?(?:\b|_)mat(?:\b|_).*?$/m
che corrisponde sia sottolinea o confini delle parole attorno alle parole specificate. (?:)
indica un gruppo non catturante, che può aiutare con le prestazioni o evitare catture in conflitto.
Modifica: nei commenti è stata sollevata una domanda sul fatto che la soluzione avrebbe funzionato per le frasi anziché solo per le parole. La risposta è assolutamente sì. Il seguente sarebbe partita "Una linea che comprende sia la prima frase e la seconda frase":
/^.*?(?:\b|_)first phrase here(?:\b|_).*?(?:\b|_)second phrase here(?:\b|_).*?$/m
Edit 2: Se l'ordine non importa è possibile utilizzare:
/^.*?(?:\b|_)(first(?:\b|_).*?(?:\b|_)second|second(?:\b|_).*?(?:\b|_)first)(?:\b|_).*?$/m
E se le prestazioni sono Davvero un problema qui, è possibile una soluzione (se il tuo motore regex lo supporta) potrebbe (ma probabilmente non lo farà) eseguire meglio di quanto sopra, ma lascerò sia la versione più complessa del test e il test delle prestazioni, quanto un esercizio alla interlocutore/lettore.
Modificato secondo il commento di @Alan Moore. Non ho avuto la possibilità di provarlo, ma ti crederò sulla parola.
come su ' "catmat" '- dovrebbe la regex abbinarlo? quelle parole dovrebbero essere parole intere? Che ne dite di "questioni spinose"? – Amarghosh
No, non dovrebbe corrispondere a nessuno di questi. Proprio queste due parole, in questo ordine, precedevano e seguivano qualsiasi altro testo. –
Vedi la mia modifica se stai usando il mio codice. – eyelidlessness