문제

바이트 빗에서 래퍼를 사용하고 있습니다 (http://bytecomb.com/regular-expressions-in-vba/). 그들은 아주 잘 작동하는 것 같습니다. 강력한 패턴을 공식화하는 데 도움이 필요합니다.

LookaheAd "(? =)"와 "|"를 결합 할 때 예상치 못한 결과를 경험합니다.

Input Text String           Pattern                 RxMatch
-----------------           -------                 -------
iraq                q(?!u)                  q
quit                q(?!u)                  0
iraq                q(?=u)                  0
quit                q(?=u)                  q
sta.23.5  .1 words 67.89  ch    \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words 67.89  ch    (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)              67.89
sta.23.5  .1 words 67.89  ch    \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       67.89
sta.23.5  .1 words .89  ch      \d+\.?\d*|\.\d+(?=\s*ch)            23.5
sta.23.5  .1 words .89  ch      (\d+\.?\d*)|(\.\d+)(?=\s*ch)        23.5
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)              89
sta.23.5  .1 words .89  ch      \d+\.?\d*(?=\s*ch)|\.\d+(?=\s*ch)       .89

"이라크"와 "종료"는 예상대로 작동합니다. 다음 입력 텍스트 문자열 세트의 경우 "67.89", 세 번째 ".89"를 추출하고자합니다. 처음에, 나는 두 상황을 모두 다루기 위해 부동 소수점 수를 위해 d+.? d*|. d+를 공식화했습니다. 괄호를 추가하는 것은 도움이되지 않았습니다. 67.89를 제거하거나 도움이되었습니다. 마침내 작동 솔루션을 찾았습니다. 그러나 더 나은 것이 있습니까? 선행 순서를 이해하도록 도와 줄 수 있습니까? 가능하다면 두 부분을 함께 유지하고 싶습니다.

고마워요, 프로그램이 아닙니다!

도움이 되었습니까?

해결책

\d+\.?\d*|\.\d+(?=\s*ch) "sta.23.5 .1 단어 67.89 ch"에 적용 \d+\.?\d*

또는 "|" 당신이 그렇게 생각하고 싶다면 패턴을 가능한 두 가지 일치로 나누고 싶다면 가장 우선 순위가 가장 높습니다. \d+\.?\d* 그리고 \.\d+(?=\s*ch)

예방하고 싶다면 \d+\.?d* 23.5와 일치하면 공간 문자를 요구하는 것과 같은 추가 기준을 추가하고 괄호 캡처를 사용하여 숫자를 서브 매치로 가져와야합니다. \s(\d+\.?\d*)

이 패턴과 일치 할 수 있습니다. \s(\d+\.?\d*)|\.\d+(?=\s*ch), 그러나 전반전이 일치하면 실제 값에 대한 서브 매치를 살펴볼 것임을 명심하십시오.

여기서 실제 문제는 VBScript의 Regexp 클래스가 Lookbehind를 지원하지 않는다는 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top