将一系列字母数字字符转换为列表(X1-3 到 X1、X2、X3)你好,
我正在尝试将一系列字母数字字符转换为列表。我对 JSL 还很陌生,我不确定如何去做。 这就是我想要实现的目标:
原版:CH1-3
返回:CH1,CH2,CH3
字符前缀并不总是包含两个字符(例如可以是 CH1-3 或 X5-8)。
我知道,如果我的范围只有两个数字,例如 CH1-2,我可以使用以下脚本来获得我想要的内容:
Regex("CH1-2", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1\2,\1\4", GLOBALREPLACE);返回 CH1,CH2
但是,我不知道如何对两个以上数字的范围执行此操作。
任何帮助将不胜感激!
回复:将一系列字母数字字符转换为列表(X1-3 到 X1、X2、X3)该脚本说明了一种执行此操作的方法:
Names Default to Here( 1 );
dt = New Table( "Col Range Test Cases",
New Column( "A",
"Character",
"Nominal",
Values( { "CH1-2,CH17,CH6-8", "T7", "MR101-103", "P4-5", "U2", "AR6-7" } )
),
New Column( "B",
"Character",
"Nominal"
)
);
For Each Row(
// tokenize current string with comma delimiter
// Row() = 1;
range = Words( Column( dt, 1 )[], "," );
For( i = 1, i <= N Items( range ), i++,
// look for col range
result = Regex Match(
range[i],
"^(\w+?)(\d+)-(\d+)\b"
);
If( N Items( result ) == 0,
// regex failed, not a col range
If( i == 1,
// start string result
answer = range[i],
// add to string result
answer = Concat( answer, ", ", range[i] );
),
// regex succeeded, a col range
letters = result[2];
first = Num( result[3] );
last = Num( result[4] );
// append columns in the range
For( n = first, n <= last, n++,
col = Char( letters ) || Char( n );
If( i == 1 & n == first,
answer = col,
answer = Concat( answer, ", ", col );
);
);
);
);
// Row() = 1;
Column( dt, 2 )[] = answer;
);回复:将一系列字母数字字符转换为列表(X1-3 到 X1、X2、X3)感谢您的答复! 这非常有帮助。
我一直试图将它与我想做的事情结合起来,但我遇到了一些困难。 也许你可以再次向我提供帮助?
我正在处理如下所示的数据表,其中有多列填充了数据。 我正在尝试替换范围值(无论它们出现在何处)
原文:
| A | 乙 | C |
| CH1-2,CH17,CH6-8 | MR101-103 | U2 |
| T7 | P4-5 | AR6-7 |
期望:
| A | 乙 | C |
| CH1,CH2,CH17,CH6,CH7,CH8 | MR101、MR102、MR103 | U2 |
| T7 | P4,P5 | AR6、AR7 |
这是我到目前为止所想出的方法来尝试替换 A 列中出现的范围值,但它不起作用。
for (i=1, i<=nrows(dt), i++,
A_List=words(column(dt, "A")[i], ",");
letters = Regex(A_List, "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1");
From = Num(Regex(A_List, "([A-Z]+)([0-9]+)(-)([0-9]+)", "\2"););
To = Num(Regex(A_List, "([A-Z]+)([0-9]+)(-)([0-9]+)", "\4"););
For( x = From, x <= To, x++,
string = Char(letters) || Char(x);
Insert Into (A_List, string);
);
);
我感谢您的帮助!
回复:将一系列字母数字字符转换为列表(X1-3 到 X1、X2、X3)处理大于 9 的数字的原始版本
ch_split = function({ch_string}, {default local},
first_num = regex(ch_string, "([0-9])");
num_loc = contains(ch_string, first_num);
prefix = substr(ch_string, 1, num_loc - 1);
num_list = words(substr(ch_string, num_loc), "-");
start = num(num_list[1]);
end = num(num_list[2]);
ch_list = {};
k = 0;
for (i = start, i <= end, i++,
k++;
ch_list[k] = prefix || char(i);
);
ch_list
);
a1 = "ABC20-29";
ch_split(a1);
a2 = "CH1-2";
ch_split(a2);回复:将一系列字母数字字符转换为列表(X1-3 到 X1、X2、X3)对于多个结果更有效的函数是正则表达式匹配() :
Names Default to Here( 1 );
// test case
original = "CH002-033";
result = Regex Match(
original,
"^(\w+?)(\d+)-(\d+)\b"
);
(请注意第一个捕获组的细微变化,因为“+”是贪婪的。)
在这种情况下,您可以以列表形式获取所有反向引用:
{"CH002-033", "CH", "002", "033"}
回复:将一系列字母数字字符转换为列表(X1-3 到 X1、X2、X3)这几乎肯定不是最有效或最干净的解决方案,但应该可以解决问题:
list = {}; // new blank list
letters = Regex("CH13-18", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\1");
From = Num(Regex("CH13-18", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\2"););
To = Num(Regex("CH13-18", "([A-Z]+)([0-9]+)(-)([0-9]+)", "\4"););
For( x = From, x <= To, x++,
string = Char(letters) || Char(x);
Insert Into (list, string);
);
print(list);