Regex-Problem mit maskierten ZeichenIch habe ein Problem mit Regex- und Klammerzeichen.
Dieses JSL-Snippet:
Show(Regex("abcdef[ghi]", "([^\[]*)\[([^\]]*)\]", "\1{\2}"))funktioniert nicht in JMP (14.1). Es gibt den folgenden Fehler:
Unexpected "([^]*)\[([^\]]*)\]", "\1{\2}"))". Perhaps there is a missing "," or ")".
Trying to parse arguments of function "Regex".Dies ist jedoch eine gültige Regex in meinem Perl-Regex-Tester. (Ich verwende Patterns unter OS X.) Geben Sie in dieser Umgebung Folgendes ein:
abcdef[ghi]
zum regulären Ausdruck
([^\[]*)\[([^\]]*)\]
unter Verwendung des Wiederbeschaffungswerts von
$1{$2}liefert das Ergebnis
abcdef{ghi}(Der Perl-Ausdruck lautet
$searchText =~ s/([^\[]*)\[([^\]]*)\]/$1{$2}/gism;).
Was ist los? Benötigt die JMP-Regex-Engine eine andere Möglichkeit, Klammerzeichen zu umgehen?
Danke.
Betreff: Regex-Problem mit maskierten ZeichenEs funktioniert auch nicht:
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\!007B([^\]]*)\]", "[{\1]");
Betreff: Regex-Problem mit maskierten ZeichenIch machte einen Fehler. Das Schreiben von Code wie diesem führt nicht zum richtigen Ergebnis.
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\([^\]]*)\]", "[\1]");
Betreff: Regex-Problem mit maskierten ZeichenSo gehen Sie mit dieser Kombination um: Der Bereich der Reservierungen reicht von „:[{“ Anfang、 bis Ende „]“.
{:[[ghi]]:[{op},{q}]}abcdefBrauchen, um:
[{op},{q}]
Betreff: Regex-Problem mit maskierten ZeichenAls Folge habe ich etwas über Perl-Regex gelernt, was ich nicht wusste, und zwar, dass die Engine intelligent genug ist, um zu wissen, dass „[^[]“ „alles außer „[“ bedeutet. Das heißt, die Engine ist klug genug, in diesem speziellen Kontext nicht auf einem Backslash vor dem zweiten „[“ zu bestehen. Es weiß auch, wie „[^abc[]“ richtig interpretiert wird.
Es scheint, dass die Engine in JMP dies auch versteht.
Ich habe mir also mehr Ärger gemacht als nötig, indem ich dem „[“ entkommen bin.
Betreff: Regex-Problem mit maskierten ZeichenAha! Vielen Dank sowohl an pmroz als auch an Mark. Mit etwas Fummelei habe ich herausgefunden, wie ich tun kann, was ich will.
1. Für den JSL-Interpreter maskieren Sie zunächst die gesamte Regex-Zeichenfolge mit \[…]\.
2. Dann maskieren Sie zum Nutzen der Regex-Engine die Klammerzeichen wie in Perl.
Das Ergebnis ist:
Show(Regex("abcdef[ghi]", "\[([^\[]*)\[([^\]]*)\]]\", "\1{\2}"));was das erwartete Ergebnis liefert von;
abcdef{ghi}Wenn wir die Zeichenfolge aufschlüsseln, haben wir:
1. \[ für JSL
2. [([^\[]*)\[([^\]]*)\] für die Regex-Engine (genau wie in Perl)
3. ]\ für JSL
Puh!!!
Betreff: Regex-Problem mit maskierten ZeichenDas Backslash-Zeichen wird im Allgemeinen verwendet, um das nächste Zeichen zu maskieren, genau wie die Perl-Variante, bezeichnet aber auch spezielle Zeichensätze wie \S für Leerzeichen oder \D für Ziffern. Es würde Ihnen nicht gelingen, wenn Sie eintreten wollten S beim Eintreten \S im regulären Ausdruck. Die Escape-Sequenz \[ ist etwas Besonderes und es ist mit dem Abschluss verbunden ]\ Reihenfolge. Das heißt, es ist nicht die Möglichkeit, das Literal einzubeziehen ] Charakter. Stattdessen wird die Zeichenfolge bis zur abschließenden Escape-Sequenz eingeschlossen.
Sehen Sie sich dieses Beispiel in Explosionsform (vier Erfassungsgruppen) an, das ihre Funktionsweise veranschaulicht:
Regex(
"abcdef[ghi]",
"([^\[\[]\]*)" || "(\[\[]\)" || "([^\[\[]\]*)" || "(\[\]]\)",
"\1-\2-\3-\4"
);
Betreff: Regex-Problem mit maskierten Zeichen@pmroz ist richtig. Lange bevor die Regex-Unterstützung hinzugefügt wurde, traf JMP die unglückliche Entscheidung, zuzulassen, dass \[ ... ]\ an einer beliebigen Stelle in einer Zeichenfolge alle Sonderzeichenbedeutungen dazwischen ignoriert. Um den wörtlichen Text \[ zu erhalten, muss JMPs anderer Escape-Mechanismus \!X verwendet und X durch \ ersetzt werden, um ein \ darzustellen, das nicht mit dem [ kombiniert wird, wenn JMP die JSL analysiert. Später, wenn Regex das Muster analysiert, folgt auf \ das [, was wiederum Regex anweist, die besondere Bedeutung von [ zu ignorieren und es als einfaches Zeichen zu behandeln.
Ich denke darüber nach, wie ich das einfacher machen kann, danke für den Bericht!
Betreff: Regex-Problem mit maskierten ZeichenInteressanter Gedanke. In Perl maskiert \ nur das nächste Zeichen.
Aber wenn das in JMP anders ist, dann sollte das funktionieren:
Show(Regex("abcdef[ghi]", "([^\[\]*)\[\([^\]\].*)\]\", "\1{\2}"))
Leider ist Folgendes nicht der Fall:
Regex: erwartet ')' an Position 21 im Muster '([^\]*)\[\([^\].*)\]\'. beim Zugriff oder bei der Auswertung von 'Regex' , Regex/*###*/("abcdef[ghi]", "([^\]*)\!\[\([^\].*)\]\", "\1{\2}")
Betreff: Regex-Problem mit maskierten ZeichenDies wird tun, was Sie wollen.Musste den beiden Escape-Sequenzen entkommen!
Show(Regex("abcdef[ghi]", "([^\[\[]\]*)\[\[]\([^\]]*)\]", "\1{\2}"));
Regex("abcdef[ghi]", "([^\!\[]*)\!\[([^\]]*)\]", "\1{\2}") = "abcdef{ghi}";Betreff: Regex-Problem mit maskierten ZeichenIch frage mich, ob es daran liegt, dass Ihre Zeichenfolge die Zeichenfolgen-Escapezeichenfolge „\[“ enthält.Diese Sequenz bedeutet, dass alles danach als String behandelt wird, bis Sie auf „]\“ klicken.
"([^ \[ ]*) \[ ([^\]]*) \] "
Betreff: Regex-Problem mit maskierten ZeichenPS Seltsamerweise funktioniert das in JMP gut:
Show(Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]"))ergibt das richtige Ergebnis:
Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]") = "abcdef[ghi]";Betreff: Regex-Problem mit maskierten Zeichen