Problema Regex con caratteri sfuggitiHo un problema con i caratteri regex e tra parentesi.
Questo frammento JSL:
Show(Regex("abcdef[ghi]", "([^\[]*)\[([^\]]*)\]", "\1{\2}"))non funziona in JMP (14.1). Dà il seguente errore:
Unexpected "([^]*)\[([^\]]*)\]", "\1{\2}"))". Perhaps there is a missing "," or ")".
Trying to parse arguments of function "Regex".Tuttavia, questa è un'espressione regolare valida nel mio tester regex Perl. (Io uso Patterns su OS X.) In quell'ambiente, inserendo:
abcdef[ghi]
all'espressione regolare
([^\[]*)\[([^\]]*)\]
utilizzando il valore di sostituzione di
$1{$2}dà il risultato
abcdef{ghi}(L'espressione Perl è
$searchText =~ s/([^\[]*)\[([^\]]*)\]/$1{$2}/gism;).
Cosa sta succedendo? Il motore regex di JMP ha bisogno di qualche altro modo per sfuggire ai caratteri tra parentesi?
Grazie.
Ri: Problema Regex con caratteri sfuggitiNon funziona neanche:
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\!007B([^\]]*)\]", "[{\1]");
Ri: Problema Regex con caratteri sfuggitiHo fatto un errore. Scrivere codice come questo non ti dà il risultato giusto.
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\([^\]]*)\]", "[\1]");
Ri: Problema Regex con caratteri sfuggitiCome gestire questa combinazione: L'intervallo di prenotazioni va da ":[{" start、 a end "]".
{:[[ghi]]:[{op},{q}]}abcdefBisogno di ottenere:
[{op},{q}]
Ri: Problema Regex con caratteri sfuggitiCome follow-up, ho imparato qualcosa che non sapevo su Perl regex, e cioè che il motore è abbastanza intelligente da sapere che "[^[]" significa "tutto tranne "[". Vale a dire, il motore è abbastanza intelligente da non insistere su una barra rovesciata prima del secondo "[" in questo particolare contesto. Sa anche come interpretare correttamente "[^abc[]".
Sembra che anche il motore di JMP lo capisca.
Quindi mi stavo creando più problemi del necessario sfuggendo al "[".
Ri: Problema Regex con caratteri sfuggitiAh! Grazie sia a pmroz che a Mark. Con un po' di giocherellare, ho capito come fare quello che voglio.
1. A beneficio dell'interprete JSL, per prima cosa esegui l'escape dell'intera stringa regex usando \[…]\.
2. Quindi, a beneficio del motore Regex, esegui l'escape dei caratteri tra parentesi come faresti in Perl.
Il risultato è:
Show(Regex("abcdef[ghi]", "\[([^\[]*)\[([^\]]*)\]]\", "\1{\2}"));che produce il risultato atteso di;
abcdef{ghi}Scomponendo la stringa abbiamo:
1. \[ per JSL
2. [([^\[]*)\[([^\]]*)\] per il motore Regex (proprio come in Perl)
3. ]\ per JSL
Uff!!!
Ri: Problema Regex con caratteri sfuggitiIl carattere backslash è usato per sfuggire al carattere successivo, in generale, proprio come il sapore Perl ma denota anche set di caratteri speciali come \S per caratteri spazio o \D per cifre. Non ci riusciresti se volessi entrare S entrando \S nella regex. La sequenza di fuga \[ è speciale ed è abbinata alla chiusura ]\ sequenza. Cioè, non è il modo di includere il letterale ] carattere. Includerà invece la stringa fino alla sequenza di escape di chiusura.
Guarda questo esempio in forma esplosa (quattro gruppi di acquisizione) che illustra come funzionano:
Regex(
"abcdef[ghi]",
"([^\[\[]\]*)" || "(\[\[]\)" || "([^\[\[]\]*)" || "(\[\]]\)",
"\1-\2-\3-\4"
);
Ri: Problema Regex con caratteri sfuggiti@pmroz è corretta. JMP ha fatto una scelta sfortunata, molto prima dell'aggiunta del supporto regex, per consentire a \[ ... ]\ in qualsiasi punto di una stringa di ignorare tutti i significati dei caratteri speciali intermedi. Per ottenere il testo letterale \[ è necessario utilizzare l'altro meccanismo di escape di JMP \!X, sostituendo X con \ , per rappresentare un \ che non si combina con [ quando JMP sta analizzando il JSL. Successivamente, quando l'espressione regolare analizza il pattern, \ è seguito da [ che a sua volta indica all'espressione regolare di ignorare il significato speciale di [ e di trattarlo come un semplice carattere.
Sto pensando a come semplificare le cose, grazie per la segnalazione!
Ri: Problema Regex con caratteri sfuggitiPensiero interessante. In Perl \ salva solo il carattere successivo.
Ma se questo è diverso in JMP, dovrebbe funzionare:
Mostra(Regex("abcdef[ghi]", "([^\[\]*)\[\([^\]\].*)\]\", "\1{\2}"))
Sfortunatamente, non:
Regex: in attesa di ')' alla posizione 21 nel modello '([^\]*)\[\([^\].*)\]\'. in accesso o valutazione di 'Regex' , Regex/*###*/("abcdef[ghi]", "([^\]*)\!\[\([^\].*)\]\", "\1{\2}")
Ri: Problema Regex con caratteri sfuggitiQuesto farà quello che vuoi.Ho dovuto sfuggire alle due sequenze di fuga!
Show(Regex("abcdef[ghi]", "([^\[\[]\]*)\[\[]\([^\]]*)\]", "\1{\2}"));
Regex("abcdef[ghi]", "([^\!\[]*)\!\[([^\]]*)\]", "\1{\2}") = "abcdef{ghi}";Ri: Problema Regex con caratteri sfuggitiMi chiedo se è perché hai la sequenza di caratteri di escape della stringa "\[" nella tua stringa.Quella sequenza significa trattare tutto in seguito come una stringa fino a quando non premi "]\".
"([^ \[ ]*) \[ ([^\]]*) \] "
Ri: Problema Regex con caratteri sfuggitiPS Stranamente, questo funziona bene in JMP:
Show(Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]"))ottenendo il risultato corretto:
Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]") = "abcdef[ghi]";Ri: Problema Regex con caratteri sfuggiti