正規表現のヘルプ -こんにちは、正規表現関数を使用するには少し助けが必要です --
文字列は次のようなものです --
「結構です。2020.任意です。(そうではありません)」
必須 -- 「Fine_2020_Optional」
いくつかの組み合わせを試しましたが、1つの正規表現で結果を取得できませんでした。 for ループ スクリプトでこのタイプの正規表現を使用しています。
何か助けはありますか?
ありがとう。
Re: 正規表現のヘルプ -ありがとう。 これはとても役に立ちますRe: 正規表現のヘルプ -@Craige_Hales工藤×10^6
ありがとう
Re: 正規表現のヘルプ -こんにちは@バイロン_JMP !
次のようにするかもしれません:
source = "(aaa).Fine.2020.Optional.(Not).more.(leave out).last.(bbb)";
//
// remove text between parens, change . to _
//
parts = {}; // accumulator list of the individual parts
ipart = 0; // index to the parts list
rc = Pat Match( // test the rc (below) to make sure the match worked
source,
patpos(0) // PatRepeat must start at the beginning.
+
Pat Repeat(
( "." | Pat Pos( 0 ) ) // advance past a required period, or begin of string
+ // followed by either...
(
( "(" + Pat Break( ")" ) + ")" )
// above: match open paren and stop on a close paren. Parens and everything
// between is rejected by not adding anything to the list of parts.
| // or
( ( Pat Break( "." ) | Pat Rem() ) >> parts[ipart += 1] )
// above: scan forward up to, but not including, a period, or if
// that doesn't work, to the end (remainder) of the string.
// ipart += 1 adds 1 before subscripting. It is OK to add an item
// to a list just beyond the end of the list. The >> operator stores
// the matched value on its left into the variable on its right.
)
)
+
patrpos(0) // PatRepeat must stop at the end.
);
// re-join the parts with the _ separator
result = if(rc,Concat Items( parts, "_" ),"problem with match");
show(result);result = "Fine_2020_Optional_more_last";
これはかなり長く、かなり不透明です (正規表現ほど不透明ではないかもしれません)。 しかし...
- Regex() は、実際には複数の置換を行うことを目的としています。 GLOBALREPLACE は効率的に実行されます。 おそらく、削除するには 2 番目の正規表現が必要になります (文章)、複数ある場合は GLOBALREPLACE も使用します。
- Jeff の例では Word() も良いです保持する数と(テキスト)が表示される場所がわかっている場合。 シンプルさと保守性、そしておそらく速度の点でこれに勝るものはありません。
- PatMatch() は他の場所でも活躍します。実際には、情報を抽出するか、せいぜい 1 つの場所で文字列を書き換えるだけです (GLOBALREPLACE はありません)。 この例では、PatMatch() が情報を抽出してパーツのリストを作成し、パーツを再組み立てする様子を示しています。
一方、これは、パターン マッチングを使用して文字列から情報を抽出する方法についての優れた入門書です。 本当の利点は、一致では起動時のオーバーヘッドが 1 回だけであるため、単一の一致 (上記のように短い文字列) で長い文字列を解析できることです。 PatRepeat に 1 回のパスで文字列を移動させ、文字列を変更しないことにより、一致をかなり高速に行うことができます。
Re: 正規表現のヘルプ -パターンマッチも良い解決策かもしれませんが、構文でつまずいてしまいます。 SNOLを流暢に話せる人が周りにいれば…。 @Craige_Hales
Re: 正規表現のヘルプ -文字列操作を行うための組み込み JMP 関数を忘れないでください。代わりの() 、マンガー()そして、私のお気に入り、言葉() 。 このような場合には、これらの構文の方が扱いやすいかもしれません。
str="Fine.2020.Optional.(Not)";
show(substitute(str, ".", "_"));
show(word(1, str, ".") || "_" || word(2, str, ".") || "_" || word(3, str, "."));
show(concat items(words(str, ".")[1::3], "_"));
ログ:
Substitute(str, ".", "_") = "Fine_2020_Optional_(Not)";
Word(1, str, ".") || "_" || Word(2, str, ".") || "_" || Word(3, str, ".") = "Fine_2020_Optional";
Concat Items(Words(str, ".")[Index(1, 3)], "_") = "Fine_2020_Optional";
Re: 正規表現のヘルプ -さて、オフラインでは、非常に短い解決策についていくつかのコメントを受け取りました。
ここでは自力でそこに行く方法を説明します。 不正行為かもしれませんが、とても簡単です。
例を含めた表を作成しました。 列を選択し、recode を使用しました。
Recode では文字列の置換を使用し、正規表現をオンにしました。
再コードダイアログで両方のスクリプトオプションをオンにしました(右下)
次に、スクリプトをスクリプト ウィンドウに保存し、少しコピーしてここに貼り付けます。 (まあ、動作することを確認してから貼り付けました。)
多大なる感謝を@ErnestPasour 


ああ、「\」を使った部分もあります。それよりも "。"一人で。 バックスラッシュはエスケープ文字であり、すべてを「_」に置き換えることを防ぎます。 これを機能させるために必要な正規表現の知識はこれだけです。
Re: 正規表現のヘルプ -正規表現( 「これはjmpです」 、 「\。」 、 「_」 、GLOBALREPLACE );
Re: 正規表現のヘルプ -これは本当にとても役に立ちます。 ありがとう。
Re: 正規表現のヘルプ -この Web サイトには、正規表現に関する優れた一般情報がいくつかあります。
https://www.正規表現.info/quickstart.html
入力と予想される出力に基づいて正規表現を生成するツールもあります。
http://regex.inginf.units.it/
Re: 正規表現のヘルプ -ありがとうポール、
これより単純なものはほとんどありませんでしたが、私はそれを行うことができましたが、これがそれでした。それは私にいくつかの問題を引き起こしました。 次回、何か問題が見つかった場合は、詳細をご連絡させていただきます。 正規表現に関する良い例を私/us に共有するための参考/リンクはありますか? それはとても役に立ちます。
再度、感謝します。Re: 正規表現のヘルプ -入力と予想される出力の例と、どこで問題が発生するかについてもっと多くの例があれば役立つでしょう。 以下の JSL は単一のケースでは機能しますが、一般的にすべてのデータに適用できるかどうかはわかりません。
Regex("Fine.2020.Optional.(Not)",
"(\w+?)\.(\d+?)\.(\w+?)\.\(\w+?\)",
"\1_\2_\3"
);