AS3 RegExp per abbinare parole con caratteri di tipo di confine in loro
-
16-09-2019 - |
Domanda
Sono voler abbinare una lista di parole che è abbastanza facile quando queste parole sono davvero parole. Per esempio /\b (pop|push) \b/gsx
quando correva con la stringa
pop ha dato la porta una spinta ma spuntato di nuovo
corrisponderà le parole pop e spingere, ma non spuntato.
ho bisogno di funzionalità simili per le parole che contengono caratteri che normalmente qualificarsi come confini di parola. Quindi ho bisogno di /\b (reverse!|push) \b/gsx
quando correva con la stringa
spinta inversa! invertire! spingere
solo a corrispondenza inversa! e spingere ma non corrispondenza inversa! spinta. Ovviamente questo regex non ha intenzione di farlo così che cosa fare ho bisogno di usare al posto di \ b per fare il mio regex abbastanza intelligente per gestire queste esigenze funky?
Soluzione
Alla fine di una parola, \ b significa "il carattere precedente era un carattere di parola, e il carattere successivo (se c'è un carattere successivo) non è un carattere di parola. Si vuole far cadere la prima condizione perché ci potrebbe essere un carattere non-parola alla fine della "parola" che ti lascia con un lookahead negativo:.
/\b (reverse!|push) (?!\w)/gx
Sono abbastanza sicuro regex AS3 supportano lookahead.
Altri suggerimenti
Il primo problema è che avete bisogno di tre (forse quattro) i casi in alternanza, non due.
-
/\breverse!(?:\s|$)/
retromarcia! di per sé -
/\bpush\b/
spinta da sola -
/\breverse!push\b/
insieme -
/\bpushreverse!(?:\s|$)/
questo è il caso possibile
Il secondo problema è che un \b
non corrisponderà dopo un "!"
perché non è un \w
. Ecco cosa Perl 5 ha da dire su \b
, si consiglia di consultare i vostri documenti da vedere se sono d'accordo:
Un limite di parola ( "\ b") è un posto tra i due personaggi che ha un "\ w" su un lato di essa e un "\ W" al di là di essa (in qualsiasi ordine), contando il personaggi immaginari off all'inizio e alla fine della stringa corrispondenti a "\ W". (All'interno classi di caratteri "\ b" rappresenta backspace piuttosto che un confine di parola, così come avviene normalmente in qualsiasi stringa tra virgolette doppie.)
Quindi, l'espressione regolare di cui avete bisogno è qualcosa di simile
/ \b ( reverse!push | reverse! | push ) (?: \s | \b | $ )+ /gx;
ho lasciato il /s
perché non ci sono periodi in questa regex, quindi trattano come singola linea non ha senso. Se /s
non significa trattare come una singola riga nel tuo motore probabilmente si dovrebbe aggiungere indietro. Inoltre, si dovrebbe leggere su come il motore gestisce alternanza. So che in Perl 5 per ottenere il giusto comportamento è necessario disporre gli oggetti in questo modo (in caso contrario invertire! Sarebbe sempre vincere su invertire! Spingere).
È possibile sostituire \ b da qualcosa di equivalente, ma meno rigida:
/(?<=\s|^)(reverse!|push)(?=\s|$)/g
In questo modo viene eliminato il fattore limitante della \b
(che può corrispondere solo prima o dopo un carattere di parola \w
effettivo).
Ora spazio bianco o l'inizio / fine della funzione di stringa separatori validi, e l'espressione interna possono essere facilmente costruiti a tempo di esecuzione, da un elenco di termini di ricerca, per esempio.