將一系列字母數字字符轉換為列表(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);