模式匹配你好,
我正在嘗試替換部分文本,希望得到程式碼方面的幫助。
我注意到使用舊的列名語法執行 jsl 會影響運行時間。
我想製作一個腳本,它採用我當前的 jsl 程式碼並將其從以下內容進行更改:
:Name( "col_name" )
對此:
:"col_name"n
我嘗試使用 Regex 和 Patt Match,但沒有成功。
有人知道怎麼做嗎?
自動化和腳本回覆:模式匹配您是否嘗試使用搜尋腳本執行此操作?

更換後

:Name\( (.+?) \)
:\1n
回覆:模式匹配不,我正在嘗試使用 Regex 或 Patt Match 函數做完全相同的事情。
回覆:模式匹配T/S 幾天后,我發現沒有辦法在 jsl 中做到這一點,而不會丟失被重寫的 jsl 程式碼中的註解。
所以我用python寫了一個程式碼來做這件事
# This code will replace code in .jsl files that match the Regex in parameters dictionary (pattern(1) and repl(2)) below.
# It is based on the simple def replace(source, dest) function, with pattern now being the source and the repl as the dest.
# The pattern in this code is to replace old JMP column naming syntax to the new JMP column naming syntax,
# e.g :Name( "variable@property" ) into :"variable@property"n
# for jsl code to run more efficiently in JMP17 and above
import os
import re
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
root.withdraw()
WORKING_DIR = filedialog.askdirectory()
# pattern(1)
pattern = r':\s*Name\s*\(\s*"([^"]+)"\s*\)'
# repl(2)
repl = r':"\1"n'
parameters = {pattern: repl}
def pat_replace(pat, rep):
for dname, dirs, files in os.walk(WORKING_DIR):
for fname in files:
if fname.endswith(".jsl"):
fpath = os.path.join(dname, fname)
with open(fpath, encoding="utf8") as f:
s = f.read()
s_out = re.sub(pat, rep, s)
with open(fpath, "w", encoding="utf8") as f:
f.write(s_out)
for i, (key, value) in enumerate(parameters.items()):
pat_replace(key, value)回覆:模式匹配如果你有這樣的腳本
Names Default To Here(1);
// this is comment
:Name("col_name");
:Name("col_name2");
您絕對可以替換那些 :Name("colname") 類型的字串,而無需刪除註解。
腳本.jsl

Script2.jsl

Names Default To Here(1);
path_to_file = "$DOWNLOADS/Script.jsl";
path_to_new_file = "$DOWNLOADS/Script2.jsl";
str = Load Text File(path_to_file);
new_str = Regex(str, ":Name\( (.+?) \)", ":\1n", GLOBALREPLACE);
// Write(new_str);
Save Text File(path_to_new_file, new_str);
回覆:模式匹配....完整的腳本可能如下所示
WORKING_DIR = Pick Directory( "Select a directory" );
pattern = "\[:\s*Name\s*\(\s*"([^"]+)"\s*\)]\";
rep = "\[:"\1"n]\";
pat_replace = Function( {pat, rep},
For Each( {f}, Files In Directory( WORKING_DIR, recursive(1) ),
If( Ends With( f, ".jsl" ),
f = WORKING_DIR || f;
text = Load Text File( f );
newtext = Regex( text, pat, rep, GLOBALREPLACE );
If( newtext != text,
Save Text File( f || ".new.jsl", newtext );
);
)
)
);
pat_replace( pattern, rep );
/*
the "\[...]\" escape in JSL is NOT a perfect replacement for the
python r-string, though it does work for this example. In particular,
if the regex contains ]\ it will not work out without more escaping
magic.
The file is renamed when saved so if something goes wrong...you could
save to another directory, etc.
Recursive(1) includes subdirs, change as needed.
*/