선택적 문자를 찾는 정규식아래에 Str1 및 Str2와 같은 텍스트 문자열이 있습니다.
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
따라서 키워드와 콜론이 접두사로 붙은 쉼표로 구분 된 값 목록이 있습니다. 쉼표로 구분 된 목록 뒤에 추가 변수가 올 수도 있고 그렇지 않을 수도 있습니다. 그럴 경우 쉼표로 구분 된 목록과 후속 변수는 Str2에 표시된대로 세미콜론으로 구분됩니다.
쉼표로 구분 된 목록을 가져오고 싶습니다. 다음 정규식을 시도했습니다.
ParamLst1 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*);?")[3];
나는 그것이 "ParamList :"를 찾은 다음 (. *) 욕심이 모든 것을 문자열의 끝까지 일치시킬 것이라고 생각하지만 0 또는 1 개의 세미콜론을 찾을 때까지 백업 할 것입니다.
Str2를 사용하면 모든 것을 문자열의 끝으로 되돌릴 수 있기 때문에 잘못 생각하고있는 것 같습니다 ( "Param1, Param2, Param3; Var2; Var3").
나는 함수라는 단어를 사용하여 자신을 구제 할 수 있습니다.
word(1,ParamLst2 = RegexMatch(Str2, "(ParamList:)(.*)")[3],";");
그리고 이것은 Str1과 Str2 모두에서 작동하지만 정규식을 조금 더 잘 이해할 수 있다면 불필요하다고 확신하는 복잡성을 추가하고 있습니다!
어떤 아이디어?
스크립팅Re : 정규식 찾기 옵션 문자다음은 JSL의 문자열 함수를 사용한 간단한 무차별 대입 접근 방식입니다.
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
s1 = substr(str1, 11);
w1 = words(s1, ";");
plist1 = words(w1[1], ",");
s2 = substr(str2, 11);
w2 = words(s2, ";");
plist2 = words(w2[1], ",");<BR />show(plist1, plist2);
산출:
plist1 = {"Param1", "Param2", "Param3"};
plist2 = {"Param1", "Param2", "Param3"};Re : 정규식 찾기 옵션 문자또는 정규식 사용
Str1 = "ParamList:Param1,Param2,Param3";
Str2 = "ParamList:Param1,Param2,Param3;Var2;Var3";
regex(Str2, "^([^:]*):([^;]*);?(.*)$", "part1='\1' part2='\2' part3='\3'" )
part1 = 'ParamList'part2 = 'Param1, Param2, Param3'part3 = ''
또는
part1 = 'ParamList'part2 = 'Param1, Param2, Param3'part3 = 'Var2; Var3'
시작 ^ 및 끝 $는 정규식이 처음부터 끝까지 일치하도록합니다. [^ :]는 다음이 아닌 문자와 일치하고 [^;]는 다음이 아닌 문자와 일치합니다. . 고독한 : 필요한 지나서 가져옵니다 : 그리고;? 선택 사항입니다. .. *는 나머지 문자 (있는 경우)와 일치합니다.
괄호는 캡처 그룹을 만듭니다. 그룹은 세 번째 매개 변수에서 \ 1, \ 2 및 \ 3으로 참조되며 결과를 만드는 문자열에 삽입됩니다.
* 연산자는 모두 작성되므로 "너무 멀리"이동하지 않고 백업 할 필요가 없습니다. 이것은 매칭을 효율적으로 만듭니다. 구분 기호까지 모든 것을 일치시킬 수있는 경우 음수 문자 클래스를 사용하십시오.
원하는 경우 결과 문자열은 "\ 2"가 될 수 있습니다.