パターンマッチこんにちは、
テキストの一部を置き換えようとしており、コードに関する支援をいただければ幸いです。
古い列名構文で jsl を実行すると実行時間が長くなることに気付きました。
現在の jsl コードを取得してこれを変更したスクリプトを作成したいと思います。
:Name( "col_name" )
これに対して:
:"col_name"n
Regex と Patt Match を使ってみましたが、うまくいきませんでした。
誰かこれをどうやってやるのか知っていますか?
自動化とスクリプトRe: パターンマッチSearch Script を使用してこれを実行しようとしていますか?

交換後

:Name\( (.+?) \)
:\1n
Re: パターンマッチいいえ、Regex または Patt Match 関数でまったく同じことを実行しようとしています。
Re: パターンマッチ数日間の 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)Re: パターンマッチこのようなスクリプトがある場合
Names Default To Here(1);
// this is comment
:Name("col_name");
:Name("col_name2");
コメントを削除せずに、:Name("colname") タイプの文字列を置き換えることは可能です。
スクリプト.jsl

スクリプト2.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);
Re: パターンマッチ...そして完全なスクリプトは次のようになります
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.
*/