エスケープ文字による正規表現の問題正規表現と括弧文字に問題があります。
この JSL スニペットは次のとおりです。
Show(Regex("abcdef[ghi]", "([^\[]*)\[([^\]]*)\]", "\1{\2}"))JMP (14.1) では動作しません。 次のエラーが表示されます。
Unexpected "([^]*)\[([^\]]*)\]", "\1{\2}"))". Perhaps there is a missing "," or ")".
Trying to parse arguments of function "Regex".ただし、これは Perl 正規表現テスターでは有効な正規表現です。 (私は OS X でパターンを使用しています。) その環境では、次のように入力します。
abcdef[ghi]
正規表現に
([^\[]*)\[([^\]]*)\]
の置換値を使用して、
$1{$2}結果が得られます
abcdef{ghi}(Perl 式は
$searchText =~ s/([^\[]*)\[([^\]]*)\]/$1{$2}/gism;)。
何が起こっている? JMP 正規表現エンジンは括弧文字をエスケープする他の方法が必要ですか?
ありがとう。
Re: エスケープ文字に関する正規表現の問題それも機能しません:
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\!007B([^\]]*)\]", "[{\1]");
Re: エスケープ文字に関する正規表現の問題私が間違えました。このようなコードを書いても、正しい結果は得られません。
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\([^\]]*)\]", "[\1]");
Re: エスケープ文字に関する正規表現の問題この組み合わせの場合の対処方法:予約範囲は「:[{" start、 to end "]"」となります。
{:[[ghi]]:[{op},{q}]}abcdef取得する必要があります:
[{op},{q}]
Re: エスケープ文字に関する正規表現の問題フォローアップとして、Perl 正規表現について私が知らなかったことを学びました。それは、エンジンが「[^[]」が「[」以外のすべてを意味することを認識できるほど賢いということです。 つまり、このエンジンは、この特定のコンテキストでは 2 番目の「[」の前にバックスラッシュを要求しないほど賢いのです。 また、「[^abc[]」を正しく解釈する方法も認識しています。
JMP のエンジンもこれを理解しているようです。
そのため、「[」をエスケープすることで、必要以上に自分自身に迷惑をかけていました。
Re: エスケープ文字に関する正規表現の問題ああ! pmrozさんとマークさん、ありがとうございました。 少しいじってみると、やりたいことを実現する方法がわかりました。
1. JSL インタープリタの利点を考慮して、まず \[…]\ を使用して正規表現文字列全体をエスケープします。
2. 次に、正規表現エンジンの利点を考慮して、Perl の場合と同様に括弧文字をエスケープします。
結果は次のとおりです。
Show(Regex("abcdef[ghi]", "\[([^\[]*)\[([^\]]*)\]]\", "\1{\2}"));これにより、期待される結果が得られます。
abcdef{ghi}文字列を分解すると次のようになります。
1. \[ JSL の場合
2. Regex エンジンの [([^\[]*)\[([^\]]*)\] (Perl と同様)
3. ]\ (JSL の場合)
ふぅ!!!
Re: エスケープ文字に関する正規表現の問題バックスラッシュ文字は、一般に、Perl フレーバーと同様に、次の文字をエスケープするために使用されますが、次のような特殊な文字セットも示します。 \sスペース文字の場合、または\d数字の場合。 入りたくても成功しないだろうs入力することで\s正規表現で。 エスケープシーケンス\[特別であり、クロージングとペアになっています]\順序。 つまり、文字通りの内容を含める方法ではありません。 】キャラクター。 代わりに、終了エスケープ シーケンスまでの文字列が含まれます。
それらがどのように機能するかを示す、分解された形式 (4 つのキャプチャ グループ) の例を参照してください。
Regex(
"abcdef[ghi]",
"([^\[\[]\]*)" || "(\[\[]\)" || "([^\[\[]\]*)" || "(\[\]]\)",
"\1-\2-\3-\4"
);
Re: エスケープ文字に関する正規表現の問題@pmroz正しい。 JMP は、正規表現のサポートが追加されるずっと前に、文字列内の \[ ... ]\ を、その間にある特殊文字の意味をすべて無視することを許可するという残念な選択をしました。 リテラル テキスト \[ を取得するには、JMP の他のエスケープ メカニズム \!X を使用して、JMP が JSL を解析するときに [ と結合しない \ を表すために X を \ に置き換える必要があります。 その後、正規表現がパターンを解析するときに、\ の後に [ が続きます。これにより、正規表現に [ の特別な意味を無視して単純な文字として扱うように指示されます。
どうしたらもっと楽にできるか考え中です、ご報告ありがとうございます!
Re: エスケープ文字に関する正規表現の問題興味深い考えです。 Perl では、\ は次の文字のみをエスケープします。
ただし、これが JMP で異なる場合は、次のように機能するはずです。
Show(Regex("abcdef[ghi]", "([^\[\]*)\[\([^\]\].*)\]\", "\1{\2}”))
残念ながら、そうではありません。
正規表現: パターン '([^\]*)\[\([^\].*)\]\' の位置 21 に ')' が必要です。 'Regex' のアクセスまたは評価において、 Regex/*###*/("abcdef[ghi]", "([^\]*)\!\[\([^\].*)\]\", "\1{\2}")
Re: エスケープ文字に関する正規表現の問題これで希望通りのことが実現します。2 つのエスケープ シーケンスから逃れなければなりませんでした。
Show(Regex("abcdef[ghi]", "([^\[\[]\]*)\[\[]\([^\]]*)\]", "\1{\2}"));
Regex("abcdef[ghi]", "([^\!\[]*)\!\[([^\]]*)\]", "\1{\2}") = "abcdef{ghi}";Re: エスケープ文字に関する正規表現の問題文字列にエスケープ文字シーケンス「\[」が含まれているためでしょうか。このシーケンスは、「]\」に到達するまで、その後のすべてを文字列として扱うことを意味します。
"([^ \[ ]*) \[ ([^\]]*) \] 」
Re: エスケープ文字に関する正規表現の問題PS 奇妙なことに、これは JMP では正常に動作します。
Show(Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]"))正しい結果が得られます:
Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]") = "abcdef[ghi]";Re: エスケープ文字に関する正規表現の問題