Limiti di parola di JSL REGEX \ b<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Ciao, -
JSL supporta i confini delle parole REGEX \ b?
Sto cercando di sostituire parole complete nel testo usando PAT MATCH e l'espressione "\ bword \ b". Per qualche ragione, JSL non processa \ b, sebbene riconosca e processa \ W. Purtroppo \ W non è abbastanza buono per il mio compito in quanto non corrisponde a voci di singole parole tra altri problemi che introduce.
Esempio:
a = "la finestra è: apri";
p = pat regex ("\ bis \ b");
pat match (a, p, "was");
Mi aspetterei che restituisse: a = "window was: open";
Grazie! - Shaul
Re: JSL REGEX boundaries \ bAh, molto bene. Molto meglio, grazie. JMP10 ha una funzione regex semplificata che sostituisce la sostituzione globale:
regex ( "ciao", "[^ aeiou]",, GLOBALREPLACE "?");
"? E ?? o"
RegexMatch () richiede un ciclo esterno (il while () dell'esempio precedente). PatMatch () può usare una regex come parte di un pattern ma non usa i riferimenti posteriori eccetto all'interno di un patRegex (); patMatch ha lo scopo di creare un pattern usando le funzioni patXXXX piuttosto che il linguaggio regex e ha diversi modi per acquisire corrispondenze parziali.
Re: JSL REGEX boundaries \ bHo semplificato il Regex usando \ W (JMP9 accettato \ W):
x = "la volpe grande, molto veloce";
a = Regex Match (x, "(\ W | ^) (molto) (\ W | $)", "\ 1fairly \ 3");
stampa (x);
Il mio unico problema rimanente è che fa la sostituzione solo una volta, quindi ho bisogno di un ciclo finché non vengono restituite altre corrispondenze. C'è un flag, come FULLSCAN che potrei specificare in Regex Match? Non potevo convincere Pat Match a lavorare per qualche motivo.
In ogni caso, mi hai già aiutato molto!
Re: JSL REGEX boundaries \ bLe espressioni parentesi nella regex formano un gruppo di cattura che può essere riferito al numero; conta solo i paren aperti, da sinistra a destra, per ottenere il numero. Il testo abbinato dal gruppo di cattura può essere usato come riferimento posteriore più avanti nella regex o nella stringa di sostituzione. \ 1 è un riferimento posteriore al primo gruppo di acquisizione.
regexMatch (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] {4}) ([^ a-zA-Z0-9_] | $)", " \ 1fairly \ 3 ");
ha 3 parens aperti; il set intermedio (attorno alla parola che viene abbinata) non era realmente necessario, ma poiché sono lì uso \ 1 e \ 3 nella stringa di sostituzione. \ 0 si riferisce all'intera partita. Se nidifichi i gruppi di parentesi, conti ancora solo i paren aperti, da sinistra a destra, per ottenere il numero.
Ho usato {4} ripetizioni per fare un esempio che non avrebbe trovato le parole di tre e cinque lettere nel testo sorgente che è venuto prima. Potrebbe essere necessario un altro modo per specificare la parola. Ecco un esempio che mastica le parole una alla volta:
Stampa (versione JMP ());
x = "la volpe grande, molto veloce";
Mentre (1,
results = Regex Match (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] +) ([^ a-zA-Z0-9_] | $)", "\ 1 \ 3");
Se (N Articoli (risultati)> = 3,
Stampa (risultati [3]),
Rompere()
);
);
"9.0.2"
"il"
"grande"
"molto"
"Presto"
"Volpe"
In questo esempio, il segno + significa "una o più delle espressioni precedenti", quindi potresti non aver bisogno della lunghezza esplicita. RegexMatch restituisce una lista di riferimenti posteriori; il primo elemento nell'elenco è \ 0 che rappresenta l'intera corrispondenza. i risultati [3] è \ 2, che corrisponde alla parola associata. La sostituzione è \ 1 \ 3, che taglia \ 2 fuori dalla stringa.
Ci sono un certo numero di siti web che hanno tutorial per regex. Regular-Expressions.info - Esercitazione, esempi e riferimenti Regex - Modelli Regexp , per esempio.
Gli esempi di JMP11 semplificheranno molto gli esempi.
Re: JSL REGEX boundaries \ bQuesto è molto utile dato che sono ancora su JMP9.
Dovrò regolare dinamicamente {n} in base alla lunghezza della stringa da abbinare.
Puoi approfondire come funziona la numerazione delle sostituzioni? Non sono sicuro di capire cosa fanno \ 1 e \ 3?
Grazie! - Shaul
Re: JSL REGEX boundaries \ bJMP10 non supporta il limite di parola \ b nella regex. JMP11 lo farà. Nei seguenti esempi, {4} significa 4 occorrenze del carattere precedente che è inteso a far corrispondere la parola di 4 lettere "molto" richiedendo il limite di parola a ciascun lato. La funzione regexMatch interpreta il secondo argomento come espressione regolare e interpreta il terzo argomento come testo sostitutivo con sostituzioni numerate dopo i gruppi di parentesi catturati (usati nel 2 ° esempio).
stampa (JMPVERSION ());
x = "la volpe grande, molto veloce";
regexMatch (x, "\ b \ w {4} \ b", "equamente");
stampa (x);
"11.0.0"
"la volpe grande, abbastanza veloce"
JMP10 potrebbe farlo abbastanza bene, a seconda delle esigenze, catturando i caratteri delimitatori e inserendoli nella sostituzione:
stampa (JMPVERSION ());
x = "la volpe grande, molto veloce";
regexMatch (x, "([^ a-zA-Z0-9_] | ^) ([a-zA-Z0-9 _] {4}) ([^ a-zA-Z0-9_] | $)", " \ 1fairly \ 3 ");
stampa (x);
"10.0.1"
"la volpe grande, abbastanza veloce"
\ b è un modello difficile da scrivere perché deve corrispondere sia prima che dopo una parola e tuttavia non corrisponde a nessun testo e la parola può essere all'inizio (^) o alla fine ($) di il testo. Il secondo esempio funziona attorno al requisito "nessuna corrispondenza del testo" utilizzando i gruppi parentesi \ 1 e \ 3 nel testo sostitutivo.