计算字符串中的数字段落数这可能是一个非常具体的,但我有一个包含在 JMP 单元格中的字符串,我需要能够隔离字符串中的特定数字字符段落。字符串包含字符和数字,并且顺序可以变化。例如,如果我有单元格条目
AAA1B222C3
并且我想集中精力于第 222 段,我考虑了一种方法,将数字段落的数量计为 3,然后隔离其中的第二个。
我想到了一种使用正则表达式来实现这一点的方法,但它太复杂了,不值得发布。我相信有一种更适应性的方法来实现这一点。欢迎提出各种想法。
再见
扳手头
自动化和脚本回复:计算字符串中的数字段落您能否提供更多可能的字符串和您希望隔离的部分的示例?此外,您想对这些部分做什么?提取它们?删除它们?检查它们是否存在?
回复:计算字符串中的数字段落雅尔莫
我的总体目标是创建一个新列,其中包含数值作为单元格输入。这是因为原始条目包含维度信息,我希望这些信息能够自动以数字形式提供。其中一个数字段落是长度,另一个是宽度。还有其他数字,我需要一种方法来绕过它们。实际字符串看起来更接近
Val1b200X300
这是一台长 200、宽 300 的设备,我需要包含反映这些值的单元格的新列。附加数字字符的长度和位置不一致,这增加了任务的复杂性。
再见
扳手头
回复:计算字符串中的数字段落它们总是三个字符长吗?它们总是最后两个数字吗?它们总是用“X”分隔吗?
回复:计算字符串中的数字段落雅尔莫
部分违反墨菲定律。长度不总是相同,最后 2 个数字也不总是相同,但总是用 X 分隔。
再见
扳手头
回复:计算字符串中的数字段落这可能就足够了,或者您可能需要添加一些额外的条件(检查它是在开始/结束还是之前/之后有字母)
Names Default To Here(1);
str = "Val1b200X300abcc1";
r = Regex Match(str, "(\d+)X(\d+)");
Show(Num(r[2]), Num(r[3]));
回复:计算字符串中的数字段落雅尔莫
太棒了!这就是我最终想到的。标签是包含我尝试执行操作的字符串的列。
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);
似乎有效。
再见
扳手头
回复:计算字符串中的数字段落这取决于您的数据,但您可能需要在正则表达式模式中添加一个小补充:添加对 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
回复:计算字符串中的数字段落另外,我对最初问题的最初理解是从字符串中提取最长的数字序列,因此这里有几个脚本(可能对某些人有用)。
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";