文字列内の数字の部分を数えるこれはおそらく非常に特殊なケースですが、JMPセルに文字列が含まれており、その文字列内の特定の数字の部分を分離する必要があります。文字列には文字と数字の両方が含まれており、シーケンスは可変です。たとえば、セルエントリが
ああ1b222c3
そして、222 番目の節に焦点を絞りたいので、数字の節の数を 3 として数え、そのうちの 2 番目の節を分離する方法を検討しました。
私は正規表現を使ってこれを行う方法を思いつきましたが、あまりにも複雑すぎて投稿する価値がありません。そこに到達するには、もっと適応性のある方法があるはずです。どんなアイデアでも歓迎します。
さよなら
スパナヘッド
自動化とスクリプトRe: 文字列内の数値部分を数える可能性のある文字列と分離したい部分の例をさらに提供していただけますか? また、それらの部分で何をしたいですか? 抽出しますか? 削除しますか? 存在するかどうかを確認しますか?
Re: 文字列内の数値部分を数えるジャーモ
私の全体的な目標は、セル入力として数値を含む新しい列を作成することです。これは、元のエントリに寸法情報が含まれているという事実から派生しており、それを数値形式で自動的に利用できるようにしたいのです。数値の1つは長さで、もう1つは幅です。他の数値も含まれており、それらをバイパスする手段が必要です。実際の文字列は次のようになります。
ヴァル1b200X300
これは長さ 200、幅 300 のデバイスであり、それらの値を反映して生成されたセルを含む新しい列が必要です。追加の数字文字は長さや配置が一貫していないため、タスクが複雑になります。
さよなら
スパナヘッド
Re: 文字列内の数値部分を数えるこれらは常に 3 文字ですか? 常に最後の 2 つの数字ですか? 常に「X」で区切られていますか?
Re: 文字列内の数値部分を数えるジャーモ
マーフィーの法則の部分的な違反です。必ずしも同じ長さではなく、最後の 2 つの数字が常に X で区切られるわけではありません。
さよなら
スパナヘッド
Re: 文字列内の数値部分を数えるこれで十分かもしれませんが、いくつかの追加条件を追加する必要があるかもしれません(先頭/末尾にあるか、前後に文字があるかを確認してください)
Names Default To Here(1);
str = "Val1b200X300abcc1";
r = Regex Match(str, "(\d+)X(\d+)");
Show(Num(r[2]), Num(r[3]));
Re: 文字列内の数値部分を数えるジャーモ
素晴らしいですね! 最終的に私が思いついたのがこれです。ラベルは、私が操作を実行しようとしている文字列を含む列です。
New Column("Width", Character, "Nominal", Formula(Regex(:Label, "(\d+)X", "\1")), Set Selected);
New Column("Length", Character, "Nominal", Formula(Regex(:Label, "X(\d+)", "\1")), Set Selected);
効いているようです。
さよなら
スパナヘッド
Re: 文字列内の数値部分を数えるこれはデータによって異なりますが、正規表現パターンに小さな追加を加える必要があるかもしれません。Xの反対側にある他の数字のチェックを追加して、「1Xa」のようなものになる問題を回避する
Names Default To Here(1);
strs = {"A1X2", "A1Xa", "1X2", "a1X23", "aX2", "A1X2a"};
For Each({str}, strs,
a1 = Regex(str, "(\d+)X", "\1");
a2 = Regex(str, "X(\d+)", "\1");
// vs
b1 = Regex(str, "(\d+)X(\d+)", "\1");
b2 = Regex(str, "(\d+)X(\d+)", "\2");
Write("\!NCurrent string: ", str);
Write("\!NFirst pattern matches: ", a1, " ", a2);
Write("\!NSecond pattern matches: ", b1, " ", b2);
Write("\!N");
);
Current string: A1X2
First pattern matches: 1 2
Second pattern matches: 1 2
Current string: A1Xa
First pattern matches: 1 .
Second pattern matches: . .
Current string: 1X2
First pattern matches: 1 2
Second pattern matches: 1 2
Current string: a1X23
First pattern matches: 1 23
Second pattern matches: 1 23
Current string: aX2
First pattern matches: . 2
Second pattern matches: . .
Current string: A1X2a
First pattern matches: 1 2
Second pattern matches: 1 2
Re: 文字列内の数値部分を数えるまた、最初の問題として私が最初に理解したのは、文字列から最も長い数字のシーケンスを抽出することでした。そのためのスクリプトをいくつか示します (誰かの役に立つかもしれません)。
1. Words() を使用する (同様のアイデアを使用して、数値以外の文字列を抽出することもできます)
Names Default To Here(1);
str = "aaa1b222c3";
alphabets = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
nums = Words(str, alphabets);
lengths = Transform Each({num}, nums, Output("Matrix"), Length(num));
l_idx = Loc Max(lengths);
longest_num_seq = nums[l_idx];
show(nums, longest_num_seq); //nums = {"1", "222", "3"}, longest_num_seq = "222";
2. While + 正規表現の使用
Names Default To Here(1);
str = "aaa1b222c3";
nums = {};
strcopy = str;
While(!IsMissing(match = Regex(strcopy, "\d+")),
idx = Contains(strcopy, match);
Insert Into(nums, match);
Remove From(strcopy, idx, Length(match));
);
l_idx = Loc Max(lengths);
longest_num_seq = nums[l_idx];
show(nums, longest_num_seq); //nums = {"1", "222", "3"}, longest_num_seq = "222";