2012-07-10 1 views
2

Qt 4.6을 사용하여 프로그램을 작성 중이므로 "SUM(A1:A3)+B1-B3+SUM(D1:D3)/COUNT(D1:D3)", , 즉 A1, A3, D1, D3이 아닌 B130, B3과 같은 표현식에서 범위 외 리터럴을 모두 캡처해야합니다. 나는 QRegExp를 사용하려고 시도했지만 negative lookbehind 단정을 지원하지 않으므로 A3, D3과 같은 리터럴을 제외 할 수 없습니다. 내 regexp (?<!:)([A-Z]{1,4}[1-9]\\d{0,3})(?!:)이 작동하지 않습니다. 귀하의 의견이 필요합니다. 감사. 귀하의 경우에는Qt regexp에서 부정적인 lookbehind 어설 션을 에뮬레이션하는 방법은 무엇입니까?

답변

2

당신은

(?:^|[^:])\b([A-Z]{1,4}[1-9]\d{0,3})\b(?!:)

첫 번째 그룹은 처음에 빈 문자열이나 콜론을 제외한 모든 문자와 일치를 사용할 수 있습니다. 또한 단어 경계를\b으로 추가하여 패턴이 A4a과 일치하지 않게했습니다.

종종 "긍정적 인"패턴을 쓰는 것이 더 간단합니다. 예를 들어, ...는 셀 참조를 일치하도록 [A-Z] 패턴을 나타내는 함께

(...)(:...)?

를 사용하여, 당신은 결과를 통해 반복 할 때 모든 범위를 버리고, 한 번에 범위와 비 범위를 일치시킬 수 있습니다. 두 번째 캡처 그룹이 비어 있는지 확인하여 일치 항목이 범위인지 여부를 쉽게 감지 할 수 있습니다.

+0

"긍정적 인"방식으로 패턴을 개조했으며 정상적으로 작동합니다. 고맙습니다! – VinS

0

해결 방안을 지원하지 않는 엔진에 대한 검색을 필요로하는 솔루션의 경우, 한 가지 대안을 찾았습니다. 더 복잡한 기술이 있다고는하지만, "combinatoric brute-forcing"이라고 부릅니다. 한 예가 여기에 있습니다 : Validate proxy URL using XML regex pattern.

그러나 두 개 이상의 일치를 찾으려면을 찾아야합니다. 당신은 아마이 자신과 같은 시도했다 : (.. 좀 더 안전 할 수 \b을 추가 또한, 다시 백 슬래시를 이스케이프 기억)

/[^:]\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:]/ 

를 그리고, 당신이 시도 않은 경우 problem을 확인하십시오. +B1-까지 읽은 후 첫 번째 일치 항목이 발견됩니다. 따라서 -이 이미 읽혀 졌으므로 [^:]에 적절한 문자가 없으므로 다음 셀 참조 B3을 일치시킬 수 없습니다.

위의 정규 표현식은 문제를 다시 설명하기 위해 일련의 셀 참조 체인에서 다른 모든 일치를 잡을 수 있습니다 (예 : 문자열에 대한

(A1+A2+A3+A4+A5+A6)/(B1+B2+B3+B4+B5+B6) 
^^^^ ^^^^ ^^^^ ^^^^ ^^^^ ^^^^ 

는 ...에만 표시된 부분은 here 표시, 일치합니다.

단일 정규식에서이 문제를 해결할 방법이 없습니다. 대안 :

  1. 비 정규식 방식을 사용하십시오.

  2. 당신이 어떤 이유로 해야 사용 정규식, 다음 아마 당신의 유일한 희망은 적어도 정규 표현식에 사용할 수하는 경우 (예를 들어,첫 번째 셀 참조를 사용하여 모든 셀 참조 문자열과 같은 공백을 삽입하여 연속적인 셀 참조 체인이 없음).

  3. 또는 가능한 경우에는 .cap(1), .cap(2) 등을 통해 액세스 할 수있는 부분 집합으로 캡처하는 것이 좋습니다. 다음 작업을 수행 할 수 있습니다.


/[^:]\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:](?:(\b([A-Z]{1,4}[1-9]\d{0,3})\b[^:]))?))?))?))?))?))?/ 

음, 즉, 그래서 여기에 읽기 불가능보다 읽기 쉬운 버전입니다. 척도 XY\b([A-Z]{1,4}[1-9]\d{0,3})\b 셀 참조 표현식으로 확장됩니다. 그런 다음 위와 동일합니다 :

패턴을 참조 하시겠습니까? 앞으로 나아 가기 전에 this regex matches our example perfectly을 볼 수 있습니다. 단점은 정규 표현식을 정의하는 한 일련의 연속 셀 참조 만 처리 할 수 ​​있다는 것입니다. 위의 코드는 7을 처리 할 수 ​​있으며 그 이상의 코드는 breaks입니다.

+0

아,이 솔루션을 게시하기 전에 Qt가 look-_aheads_를 지원하는지 확인 했어야합니다. 나는 오해했다. :) –

관련 문제