正規表現を使用して角かっこを検索する仕様制限の数値を抽出したいと考えている顧客がいます。 テキストに括弧が使用されている場合は実行できますが、角括弧の場合は実行できません。角括弧「[」と「]」は特殊な正規表現文字であるため、エスケープ文字「\」または「\\」を使用すると効果があると考えましたが、機能させることができませんでした。
彼が検索しているテキストは [0.080, 1.20] のようになり、正規表現を使用して 0.080 と 1.2 を取得したいと考えています。
テキスト内の左括弧「(」を見つけるための彼の現在の式は次のようになります。
Regex( :Text, "((?<=\().+(?=\,))" )
右括弧には「)」を使用します。
Regex( :Text, "((?<=\,).+(?=\)))" )
「[」または「]」を検索するには、これらの数式をどのように変更すればよいでしょうか?
それができたら、「<」、「>」、「+」、「-」、「+/-」も見つけられるようにしたいと考えています。
助けていただければ幸いです。
ありがとう!
Re: 正規表現を使用して角かっこを検索する\[ は文字列を区切るためのエスケープ シーケンスであるため、これにはいつもつまずきます。 最初にエスケープすると、正規表現のメタ文字を示すために使用できます
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)", "\1" ) )
最初の番号について
Num( Regex( :String, "\!\[([0-9\.eE\+\-]+)\s*,([0-9\.eE\+\-]+)", "\2" ) )
2番目に。
Re: 正規表現を使用して角かっこを検索するこんにちは、チャーリー、
テキストがどのようなものか想像できますか? 顧客は正規表現さえ必要としないかもしれません。 このような設定では、結果として得られる JSL の実装と保守がはるかに簡単になることがよくあります。
例えば:
Names Default To Here(1);
text = "this is a bunch of text with some data in it between brackets [2.3, 4.5] like so.";
specTxt = word(2, text, "[]");
specLo = num(word(1, specTxt, ","));
specHi = num(word(2, specTxt, ","));
show(specLo, specHi);
Re: 正規表現を使用して角かっこを検索するしかし、16ポンドのスレッジハンマーの方が大きな衝撃を与えるのに、なぜタックハンマーを使うのでしょうか?
Re: 正規表現を使用して角かっこを検索するもっている! 仰るとおり。
Re: 正規表現を使用して角かっこを検索するこれはユーザーが投稿できる素晴らしい質問です。ディスカッションボードにアクセスして、大規模な JMP ユーザー コミュニティから得られる応答の速度と質を確認します。
私個人としては、正規表現を学んだことがないので、文字機能ほとんどの文字列操作に使用できます。 特に Word() 関数は私にとって驚くべき働きをします。
数式エディター関数を 1 つだけ学習する場合、Word() がその関数です。
Re: 正規表現を使用して角かっこを検索するこれは素晴らしいアイデアです。 また、ユーザーが何をしようとしているのかを考えるのではなく、質問に直接答えて、シンプルでより洗練された解決策を見つけるために、私と同じことを人々がどのくらいの頻度で行うのかも知りたいと思っています。 ユーザーが何を望んでいるのかを理解するのではなく、ユーザーが何を必要としているのかを理解することが常に重要です。
Re: 正規表現を使用して角かっこを検索する次に、正規表現の使用方法の別の例を示します。
Names Default to Here( 1 );
// source
string = "My spec limits are [0.080,1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" ) );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Re: 正規表現を使用して角かっこを検索するブレイディさん、ありがとう!あなたの解決策を試してみましたが、うまくいきました。シンプルさが気に入っています。「[」または「(」のいずれかを単語検索する方法はありますか?それがお客様の求めているものに近いと思います。
再度、感謝します!
チャーリー
Re: 正規表現を使用して角かっこを検索するありがとうドン!あなたの解決策は角括弧に対して機能します。どちらの場合でも機能するように、「(」または「[」のいずれかを検索させる方法はありますか?
ありがとう!
チャーリー
Re: 正規表現を使用して角かっこを検索するマーク-
あなたのソリューションを機能させるのに少し問題がありました。サンプルデータテーブルを添付しました。見てもらって、何が間違っているのか教えてもらえますか?
ありがとう、
チャーリー
Re: 正規表現を使用して角かっこを検索するありがとうジェフ。私は正規表現を全く知りませんし、文字関数も使おうとしています。ただし、お客様が簡単に適用できるように、お客様が実際に行っていた方法と非常によく似た手法を使用してお客様の質問に答えたいと考えました。
私は彼にそれをコミュニティに投稿するよう勧めました。何が起こるか見てみましょう。
ありがとう!
チャーリー
Re: 正規表現を使用して角かっこを検索するこんにちは、チャーリー、
word() 関数には 3 つの引数があり、最後の区切り文字セットはオプションです。 これは、考慮するすべての区切り文字を含む引用符で囲まれた文字列です。 したがって、ユーザーはこの文字列に括弧と括弧を挿入します。
word() が関数をどのように分割するかを確認するには、words() 関数によって返される内容を調べると役立ちます。 Words() は、区切り後のすべてのテキスト断片のリストを返します。
例えば:
単語 (2、「道路ジャックに行く」) は「the」を返します。
word(2, "Hit the road jack", "") は "i" を返します。これは、テキストを個々の文字に分割する場合に空の文字列が使用されるためです。
word(1, "abc/def[ghi]klm", "[]()") は "abc/def" を返します...words( "abc/def[ghi]klm", "[]()" ) を見ると、次のようになります。
{ "abc/def", "ghi", "klm" } 結果として。
お役に立てれば。
乾杯、
ブレイディ
Re: 正規表現を使用して角かっこを検索する本当に正規表現を使用したい場合は、次の文字列を上位または下位に使用できます。
"[\!\[|\(]([0-9\.eE\+\-]+)\s*,\s*([0-9\.eE\+\-]+)"
唯一の違いは 2 番目の引数で、下位は "\1"、上位は "\2" です。 何が起こっているのかを理解するには、式が 4 つの部分に分かれていると考えてください。
[\!\[|\(]
[a|b] は a または b のいずれかと一致します。角括弧と括弧は両方とも特殊文字であるため、バックスラッシュを使用してエスケープする必要があります。 シーケンス \[ も JSL では特殊であるため、! が必要です。特別なシーケンスではないことを示します。
([0-9\.eE\+\-]+)
括弧は、それに含まれる式を表します。 これが \1 の意味です。 ここでも、角括弧は文字セットを指定するために使用されます。 この場合、数字、ピリオド (特殊文字はエスケープ)、プラス (同上)、マイナス (同上)、小文字または大文字の E のいずれか 1 つ以上 (末尾の + による) です。 数字を表すために使用できる文字を忘れた場合は、ここに入力してください。
\s*,\s*
0 個以上のスペース、カンマ、0 個以上のスペース
([0-9\.eE\+\-]+)
最初に捉えたものと同じ表情。 \2で参照です。 素晴らしいのは、ここまで到達したら、停止できることです。 (私の知る限りでは) 右括弧や括弧をキャプチャする必要はありません。 望めばそうすることができます。
以上のことから、私は Brady のソリューションを使用するでしょう。 より簡潔で理解しやすくなります。 区切り文字のセットにカンマを追加する必要があります。つまり、
"[(,])"
Re: 正規表現を使用して角かっこを検索する前の例には、カンマの後にスペースが含まれていませんでした。 修正されたスクリプトの例は次のとおりです。
Names Default to Here( 1 );
// source 1
string = "My spec limits are [0.080, 1.20] for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
// source 2
string = "My spec limits are (0.080, 1.20) for this CQA.";
// method 1: successive calls to Regex()
lsl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\1" ) );
usl = Num( Regex( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" ) );
Show( lsl, usl );
// method 2: one call to Regex Match, then convert items
limit = Regex Match( string, "(\d*\.?\d*),\D*(\d*\.?\d*)", "\2" );
lsl = Num( limit[2] );
usl = Num( limit[3] );
Show( lsl, usl );
修正した式を記載したデータ表を添付しました。
Re: 正規表現を使用して角かっこを検索するこれは、その下にあるデータをよく理解していないと正規表現の実装がいかに難しいかを示す好例です。 スペースの有無で違いが生じました。
ここで、正当な数値形式をサポートする必要があると仮定します。 この場合、正規表現はさらに醜くなります。科学的表記法、マイナス記号、ピリオド (またはピリオド) などを考慮する必要があるからです。
このような場合、JSL 関数と正規表現を組み合わせた方が、どちらか一方を単独で使用するよりも簡単に作業を完了できる可能性があります。
たとえば、以下の JSL では次のようになります。
1) Substitute は括弧と括弧を中括弧に変更します (リスト演算子...ポイント 3 で重要)
2) 正規表現は、中括弧とそれに含まれる内容を取得し、形式を問わず正当な数値のペアであるとみなします。
3) Parse は、Regex によって返された文字列を、リストの内容を specLo および specHi に割り当てる JSL 式に変換します。
txt = "My spec limits are [-4.087e-3, 1.20] for this CQA.";
{specLo, specHi} = Parse( Regex( Substitute( txt, "(", "{", "[", "{", ")", "}", "]", "}" ), "\\!{.*\\!}" ) );
-ブレイディ
Re: 正規表現を使用して角かっこを検索するご協力いただきありがとうございます!