이스케이프 문자의 정규식 문제정규식 및 대괄호 문자에 문제가 있습니다.
이 JSL 스니펫:
Show(Regex("abcdef[ghi]", "([^\[]*)\[([^\]]*)\]", "\1{\2}"))JMP(14.1)에서는 작동하지 않습니다. 다음과 같은 오류가 발생합니다.
Unexpected "([^]*)\[([^\]]*)\]", "\1{\2}"))". Perhaps there is a missing "," or ")".
Trying to parse arguments of function "Regex".그러나 이것은 내 Perl 정규식 테스터에서 유효한 정규식입니다. (저는 OS X에서 패턴을 사용합니다.) 해당 환경에서 다음을 입력합니다.
abcdef[ghi]
정규 표현식으로
([^\[]*)\[([^\]]*)\]
교체 값 사용
$1{$2}결과가 나온다
abcdef{ghi}(펄 표현은
$searchText =~ s/([^\[]*)\[([^\]]*)\]/$1{$2}/gism;).
무슨 일이야? JMP 정규식 엔진에 대괄호 문자를 이스케이프 처리하는 다른 방법이 필요합니까?
감사해요.
Re: 이스케이프 문자와 관련된 정규식 문제작동하지 않습니다:
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\!007B([^\]]*)\]", "[{\1]");
Re: 이스케이프 문자와 관련된 정규식 문제제가 실수를. 이와 같이 코드를 작성하면 올바른 결과를 얻을 수 없습니다.
c=Regex("abcdef{:[[ghi]]:[{op},{q}]}", ":\[\[]\([^\]]*)\]", "[\1]");
Re: 이스케이프 문자와 관련된 정규식 문제이 조합을 처리하는 방법: 예약 범위는 ":[{" 시작부터 "]"까지입니다.
{:[[ghi]]:[{op},{q}]}abcdef얻을 필요:
[{op},{q}]
Re: 이스케이프 문자와 관련된 정규식 문제후속 조치로 Perl 정규식에 대해 몰랐던 사실을 알게 되었는데, 엔진이 "[^[]"가 "["를 제외한 모든 것을 의미한다는 것을 알 만큼 똑똑하다는 것입니다. 즉, 엔진은 이 특정 컨텍스트에서 두 번째 "[" 앞에 백슬래시를 요구하지 않을 만큼 영리합니다. 또한 "[^abc[]"를 올바르게 해석하는 방법도 알고 있습니다.
JMP의 엔진도 이를 이해하고 있는 것 같습니다.
그래서 "["를 피함으로써 필요한 것보다 더 많은 문제를 만들고 있었습니다.
Re: 이스케이프 문자와 관련된 정규식 문제아하! pmroz와 Mark 모두 감사합니다. 약간의 조작으로 내가 원하는 것을 수행하는 방법을 알아 냈습니다.
1. JSL 인터프리터의 이점을 위해 먼저 \[…]\를 사용하여 전체 정규식 문자열을 이스케이프합니다.
2. 그런 다음 Regex 엔진의 이점을 위해 Perl에서와 같이 괄호 문자를 이스케이프 처리합니다.
결과는 다음과 같습니다.
Show(Regex("abcdef[ghi]", "\[([^\[]*)\[([^\]]*)\]]\", "\1{\2}"));예상 결과는 다음과 같습니다.
abcdef{ghi}문자열을 분해하면 다음과 같습니다.
1. JSL의 경우 \[
2. Regex 엔진의 경우 [([^\[]*)\[([^\]]*)\](Perl에서와 동일)
3. JSL의 경우 ]\
휴!!!
Re: 이스케이프 문자와 관련된 정규식 문제백슬래시 문자는 일반적으로 Perl 풍미와 마찬가지로 다음 문자를 이스케이프하는 데 사용되지만 다음과 같은 특수 문자 집합을 나타내기도 합니다. \에스 공백 문자 또는 \디 숫자의 경우. 진입을 원하면 성공하지 못할 것입니다. 에스 입력하여 \에스 정규식에서. 이스케이프 시퀀스 \[ 특별하며 마감과 짝을 이룹니다. ]\ 순서. 즉, 리터럴을 포함하는 방식이 아닙니다. ] 성격. 대신 닫는 이스케이프 시퀀스까지 문자열을 포함합니다.
작동 방식을 설명하는 분해된 형식(네 개의 캡처링 그룹)의 이 예를 참조하십시오.
Regex(
"abcdef[ghi]",
"([^\[\[]\]*)" || "(\[\[]\)" || "([^\[\[]\]*)" || "(\[\]]\)",
"\1-\2-\3-\4"
);
Re: 이스케이프 문자와 관련된 정규식 문제@pmroz 맞다. JMP는 정규식 지원이 추가되기 훨씬 전에 불행한 선택을 하여 문자열의 모든 위치에 있는 \[ ... ]\가 중간에 있는 모든 특수 문자 의미를 무시하도록 허용했습니다. 리터럴 텍스트 \[를 얻으려면 JMP가 JSL을 구문 분석할 때 [와 결합하지 않는 \를 나타내기 위해 X를 \로 바꾸는 JMP의 다른 이스케이프 메커니즘 \!X를 사용해야 합니다. 나중에 regex가 패턴을 구문 분석할 때 \ 다음에 [가 옵니다. 그러면 정규식에 [의 특별한 의미를 무시하고 단순 문자로 취급하도록 지시합니다.
어떻게 하면 더 쉽게 할 수 있을지 고민 중입니다. 제보 감사합니다!
Re: 이스케이프 문자와 관련된 정규식 문제흥미로운 생각. Perl에서 \는 다음 문자만 이스케이프 처리합니다.
그러나 이것이 JMP에서 다르다면 다음과 같이 작동해야 합니다.
표시(Regex("abcdef[ghi]", "([^\[\]*)\[\([^\]\].*)\]\", "\1{\2}”))
불행히도, 그것은:
정규식: 패턴 '([^\]*)\[\([^\].*)\]\'에서 위치 21에 ')'가 있어야 합니다. 'Regex' 액세스 또는 평가에서 Regex/*###*/("abcdef[ghi]", "([^\]*)\!\[\([^\].*)\]\", "\1{\2}")
Re: 이스케이프 문자와 관련된 정규식 문제이것은 당신이 원하는 것을 할 것입니다.두 개의 이스케이프 시퀀스를 탈출해야 했습니다!
Show(Regex("abcdef[ghi]", "([^\[\[]\]*)\[\[]\([^\]]*)\]", "\1{\2}"));
Regex("abcdef[ghi]", "([^\!\[]*)\!\[([^\]]*)\]", "\1{\2}") = "abcdef{ghi}";Re: 이스케이프 문자와 관련된 정규식 문제문자열에 문자열 이스케이프 문자 시퀀스 "\["가 있기 때문인지 궁금합니다.이 시퀀스는 "]\"를 누를 때까지 이후의 모든 것을 문자열로 취급함을 의미합니다.
"([^ \[ ]*) \[ ([^\]]*) \] "
Re: 이스케이프 문자와 관련된 정규식 문제추신 이상하게도 이것은 JMP에서 잘 작동합니다.
Show(Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]"))올바른 결과를 산출:
Regex("abcdef(ghi)", "([^(]*)\(([^\)]*)\)", "\1[\2]") = "abcdef[ghi]";Re: 이스케이프 문자와 관련된 정규식 문제