Ich schreibe etwas, um Spaltennamen basierend auf einer Regex-Übereinstimmung zu ersetzen. Ich durchlaufe alle Spalten und vergleiche den regulären Ausdruck mit einer neuen Zeichenfolge. Funktioniert gut und ist praktisch zum Verkürzen von Spaltennamen – außer wenn ich sie durch eine Zeichenfolge ersetze, die mit einer Zahl beginnt – das liegt daran, dass die Rückreferenz durcheinander gerät (\1 wird im folgenden Fall zu \133).
In Python gibt es eine „eindeutige Rückreferenz“, um dies zu umgehen. Gibt es dasselbe in JSL? Ich habe irgendwo gelesen, dass es vielleicht Rückverweise vom Typ Perl verwendet, konnte aber nicht finden, wo dies dokumentiert ist.
Danke,
Pfirsich
colName = "COLUMNNAMETEST LONGNAMESHORTEN33339E0HS KEEPTHIS";
Rename_regx = "LONGNAMESHORTEN2339E0HS111";
Rename_to = "39E0H";
newname=Regex( colName,
"(.*?)(" || Rename_regx || ")(.*)", // match
"\1" || Rename_to || "\3") // replace match with
// "\g<1>" || Rename_to || "\g<3>") // python like unambiguous doesn't owrk
colName = "COLUMNNAMETEST LONG\1NAMESHORTEN2339E0HS111 KEEPTHIS";
Rename_regx = substitute("LONG\1NAMESHORTEN2339E0HS111","\","\\");
Rename_to = "39E \1 0H";
// \Q starts a sequence that ignores escapes
newname=Regex( colName,
"(.*?)(" || Rename_regx || ")(.*)", // match
"\1\Q" || Rename_to || "\E\3"); // replace match with
show(newname); // newname = "COLUMNNAMETEST 39E \1 0H KEEPTHIS";
// notice:
// \Q begins "quoting" and \E ends it
// the \Q has a side effect of ending the \1 (which is what you asked)
// the \1 in the replacement is NOT expanded inside the \Q...\E
// at the very top, it takes care of escaping any escapes with substitute,
// which *could* be an issue
// what else? upper and lower case:
// \L begin lower casing
// \U begin upper casing
// \E ends *all* \L, \U, or \Q
show(regex("aBcDEf","(..)(..)(..)","\1\L \2 \U\3"));//"aB cd EF"
// \l (lower case L) lower case the next character
// \u upper case the next character
show(regex("ABcdEF","(..)(..)(..)","\1 \u\2 \l\3"));//"AB Cd eF"
// the Q, L, and U modes share a common E (end)
// the q and l are not persistent and only apply to the next character.
// upper/lower is probably very ASCII specific, no Unicode magic.
// this is poorly documented here: https://www.jmp.com/support/help/en/17.2/index.shtml#page/jmp/escaped-characters-in-regular-expressions.shtml
// somehow all the escapes have been lumped together in the worst possible way.
Bearbeiten: Die Funktion regex() verfügt über zwei Parameter, die Escapezeichen verwenden. Parameter 2 ist das Muster und verwendet Escapezeichen wie erwartet. Die Zeichen \Q \U \L \E \u \l gehören hier nicht hin. Parameter 3 ist der Ersatz, und die Zeichen \Q \U \L \E \u \l können dort verwendet werden. Rückverweise \1 \2 \3 ... können sowohl in Parameter 2 als auch in Parameter 3 verwendet werden.
Bearbeiten 14. August 2025: Tatsächlich kann \U\u\L\l in Parameter 2 verwendet werden und einem einzelnen Zeichen entsprechen: u groß, U nicht groß, l klein und L nicht klein. Auch \A und \Z entsprechen den Anfangs- und Endpositionen.