영숫자 문자 범위를 목록으로 변환 (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) 목록으로 영숫자 문자 범위 변환귀하의 회신에 감사드립니다! 매우 도움이됩니다.
나는 그 일을 내가하려는 일로 부당하게 만들려고 노력했지만, 나는 어려움을 겪고있다. 아마 네게 도움을 빌려 줄 수 있니?
아래에있는 것과 같은 데이터 테이블을 다루고 있는데, 여기서 여러 개의 열이 데이터로 채워져 있습니다. 원할 때 원거리 값을 대체하려고합니다.
직제 :
| 에이 | 비 | 기음 |
| CH1-2, CH17, CH6-8 | MR101-103 | U2 |
| T7 | P4-5 | AR6-7 |
원하는 :
| 에이 | 비 | 기음 |
| 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보다 큰 숫자를 처리하는 Crude 버전
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);