Sto scrivendo qualcosa per sostituire i nomi delle colonne in base a una corrispondenza regex. Scorro tutte le colonne e la regex regex corrisponde a una nuova stringa. Funziona bene ed è utile per abbreviare i nomi delle colonne, tranne quando lo sostituisco con una stringa che inizia con un numero, questo perché il riferimento all'indietro viene incasinato (\1 diventa \133 nel caso seguente)
In Python, esiste un "backreference non ambiguo" per aggirare questo problema. C'è lo stesso in JSL? Ho letto da qualche parte che forse utilizza riferimenti backreference di tipo Perl ma non sono riuscito a trovare dove sia documentato.
Grazie,
Pesca
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.
Modifica: ci sono due parametri nella funzione regex() che usano escape. Il parametro 2 è il pattern e usa gli escape come la maggior parte delle persone si aspetta, e \Q \U \L \E \u \l non è lì. Il parametro 3 è la sostituzione, e \Q \U \L \E \u \l può essere usato lì. I backreference \1 \2 \3 ... possono essere usati sia in parm2 che in parm3.
Modifica 14 agosto 2025: in realtà, \U\u\L\l può essere utilizzato nel parametro 2 e corrispondere a un singolo carattere: u maiuscolo, U non maiuscolo, l minuscolo e L non minuscolo. Anche \A e \Z corrispondono alle posizioni iniziale e finale.