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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top