JSL REGEXの単語の境界\ b<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />こんにちは、-
JSLはREGEXの単語境界をサポートしていますか \ b?
PAT MATCHと "\ bword \ b"表現を使用して、テキスト内の完全な単語を置き換えようとしています。 何らかの理由でJSLは\ bを処理しませんが、\ Wを認識して処理します。残念ながら、\ Wは他の問題の中でも単一単語のエントリと一致しないため、私の作業には不十分です。
例:
a = "window is:open";
p = pat regex( "\ bis \ b");
pat match(a、p、"was");
私はそれが戻ってくることを期待するでしょう: a = "ウィンドウは開いていました。";
ありがとうございます。- ショール
再:JSL REGEXの単語の境界\ bああ、とてもいいですね。 もっと良かった、ありがとう。 JMP10には、グローバル置換を行う単純化された正規表現関数があります。
regex( "hello"、"[^ aeiou]"、"?"、GLOBALREPLACE);
「???」
RegexMatch()には外部ループが必要です(前の例のwhile())。 PatMatch()はパターンの一部として正規表現を使用できますが、patRegex()内以外では後方参照を使用しません。patMatchは、正規表現言語ではなくpatXXXX関数を使用してパターンを構築することを目的としており、部分一致をキャプチャするためのさまざまな方法があります。
再:JSL REGEXの単語の境界\ b\ Wを使って正規表現を簡略化しました(JMP9は\ Wを受け入れました):
x = "大きくて速いキツネ"
a =正規表現の一致(x、"(\ W | ^)(非常に)(\ W | $)"、"\ 1正しく\ 3");
print(x);
私の残っている唯一の問題はそれが一度だけ置き換えをするということですので、私はそれ以上の一致が返されなくなるまでループが必要です。 正規表現で指定できるFULLSCANのようなフラグはありますか?なんらかの理由でPat Matchを機能させることができませんでした。
いずれにせよ、あなたはすでに私を大いに助けてくれました!
再:JSL REGEXの単語の境界\ b正規表現内の括弧で囲まれた式は、数字で参照できるキャプチャグループを形成します。左から右に開いている部分だけを数えて、数を求めます。 キャプチャグループによって一致したテキストは、正規表現または置換文字列の後半で後方参照として使用できます。 \ 1は最初のキャプチャグループへの後方参照です。
regexMatch(x、"([^ a-zA-Z0-9_] | ^)([a-zA-Z0-9 _] {4})([^ a-zA-Z0-9_] | $)"、" \ 1公平\ 3 ");
3つの空き枠があります。真ん中のセット(一致する単語の周り)は実際には必要ありませんでしたが、それらがあるので、置換文字列に\ 1と\ 3を使用します。 \ 0は完全一致を表します。 括弧のグループを入れ子にしても、左から右に開いている部分だけを数えます。
私は{4}繰り返しを使用して、最初に来たソーステキストの3文字と5文字の単語が見つからない例を作りました。 他の方法で単語を指定する必要があるかもしれません。 これは一度に1つずつ単語をかみ砕く例です。
印刷(JMPバージョン())。
x = "大きくて速いキツネ"
しながら(1、
結果=正規表現の一致(x、"([^ a-zA-Z0-9_] | ^)([a-zA-Z0-9 _] +)([^ a-zA-Z0-9_] | $)"、) "\ 1 \ 3");
(N個のアイテム(結果)> = 3の場合、
印刷(結果[3])、
ブレーク()
;
;
"9.0.2"
「the」
"大"
"非常に"
「速い」
"狐"
この例では、+は「前の式の1つ以上」を意味するため、明示的な長さは必要ないかもしれません。 RegexMatchは後方参照のリストを返します。リストの最初の項目は\ 0で、これは全体の一致を表します。 results [3]は\ 2です。これは一致した単語です。 置き換えは\ 1 \ 3で、文字列から\ 2を切り取ります。
正規表現のチュートリアルがあるWebサイトがいくつかあります。 Regular-Expressions.info - 正規表現のチュートリアル、例、リファレンス - 正規表現パターン 、例えば。
JMP11の\ bは例を非常に単純化します。
再:JSL REGEXの単語の境界\ b私はまだJMP9を使っているので、これはとても役に立ちます。
一致する文字列の長さに基づいて{n}を動的に調整する必要があります。
置換の番号付けがどのように機能するかについて詳しく説明できますか?\ 1と\ 3の意味がわかりませんか。
ありがとうございました!- ショール
再:JSL REGEXの単語の境界\ bJMP10は正規表現の\ b単語境界をサポートしません。 JMP11になります。 次の例では、{4}は前の文字が4回出現することを意味します。これは、両側に単語境界を付けることによって4文字の単語 "very"に一致させることを目的としています。 regexMatch関数は、2番目の引数を正規表現として解釈し、3番目の引数を、キャプチャする括弧グループの後に番号が付けられた置換付きの置換テキストとして解釈します(2番目の例で使用)。
print(JMPVERSION());
x = "大きくて速いキツネ"
regexMatch(x、"\ b \ w {4} \ b"、"かなり");
print(x);
"11.0.0"
「大きくてかなり速いキツネ」
JMP10は、必要に応じて、区切り文字をキャプチャーしてそれらを置換文字列に戻すことによって、十分にうまくいく可能性があります。
print(JMPVERSION());
x = "大きくて速いキツネ"
regexMatch(x、"([^ a-zA-Z0-9_] | ^)([a-zA-Z0-9 _] {4})([^ a-zA-Z0-9_] | $)"、" \ 1公平\ 3 ");
print(x);
"10.0.1"
「大きくてかなり速いキツネ」
\ bは、単語の前後の両方に一致し、テキストにはまったく一致しない必要があり、単語の先頭(^)または末尾($)になる可能性があるため、記述が困難なパターンです。テキスト 2番目の例は、置換テキストに\ 1と\ 3のかっこグループを使用することで、「テキストがまったく一致しない」という要件を回避します。