2011-07-28 3 views
2

정규 표현식에 문제가 있습니다.여러 텍스트를 캡처하십시오.

우리가 문자열을

S= "[sometext1],[sometext],[sometext]....,[sometext]" 

은 "sometexts"의 수를 고려가 사용자의 입력이고, 1000 예를 ..for 하나 다를 수 있습니다, 알 수 없습니다.

[sometext]는 일련의 문자이지만 각 문자는 ","가 아니므로 [^,]라고 말할 수 있습니다.

정규식으로 텍스트를 캡쳐 한 다음 주기적으로 텍스트를 반복하고 싶습니다. sometexts의 수가 3 인 경우

QRegExp p=new QRegExp("???"); 
p.exactMatch(S); 
for(int i=1;i<=p.captureCount;i++) 
{ 
    SomeFunction(p.cap(i)); 
} 

예를 들어, 우리는 다음과 같이 사용할 수 있습니다

([^,]*),([^,]*),([^,]*). 

을 그래서 내가 대신 "???"의 작성 모르겠어요 임의의 n에 대해. Qt 4.7을 사용 중입니다. 클래스 참조 페이지에서이 작업을 수행하는 방법을 찾지 못했습니다.
우리는 정규식이없는 사이클을 통해이를 수행하거나 주기적으로 정규식을 생성 할 수 있음을 알고 있지만 실제 문제는 이보다 조금 복잡하기 때문에이 솔루션이 적합하지 않습니다.

+0

Regexes는 무제한의 캡처 그룹을 만들 수 없습니다 ... – Nightfirecat

답변

3

가능한 정규 표현식 당신이 원하는 것을 일치입니다 라인의 끝. 나는 마지막 요소가 혼수 상태에 빠졌는지 확신 할 수 없었다.

C#에서이 정규식 사용 예 : 나는 온라인 여기 가까이 솔루션에서 시도이다 QRegex에 대한 예를 사용

[sometext1] 
[sometext2] 
[sometext3] 
[sometext4] 

:

String textFromFile = "[sometext1],[sometext2],[sometext3],[sometext4]"; 

foreach (Match match in Regex.Matches(textFromFile, "([^,]+?)(,|$)")) 
{ 
    String placeHolder = match.Groups[1].Value; 

    System.Console.WriteLine(placeHolder); 
} 

이 코드는 화면에 다음과 같은 인쇄 찾으시는 대상 : (예 : 찾은 위치는 http://doc.qt.nokia.com/qq/qq01-seriously-weird-qregexp.html)

QRegExp rx("([^,]+?)(,|$)"); 
rx.setMinimal(TRUE); // this is if the Qregex does not understand the +? non-greedy notation. 

int pos = 0; 
while ((pos = rx.search(text, pos)) != -1) 
{ 
    someFunction(rx.cap(1)); 
} 

도움이되기를 바랍니다.

+0

네, 아마도 이걸 사용할 것입니다, 고마워요. 접미사와 접두사는 동일한 형식이지만 다른 구분 기호를 사용하는 식입니다.이 모든 것을 하나의 정규식으로 표현할 수 있기를 바랐습니다. IT 정규식의 현재 버전에서는 지원되지 않습니다. 나는 그것들의 개발자를 위해가는 좋은 방법일지도 모른다라고 생각한다 :) –

+1

다행스럽게도 도왔다. – Rob

0

할 수 있습니다. 즉, 당신은 쉼표 후크 비 캡처를 사용하고 블록의 많은 요청할 수 있습니다 :

시도 :

QRexExp p=new QRegExp("([^,]*)(?:,([^,]*))*[.]") 

비 캡처이 문서에 설명되어 있습니다 : http://doc.qt.nokia.com/latest/qregexp.html

RegExp에서 의미가 있기 때문에 .을 괄호로 묶었 고 문자 그대로의 기간이되기를 원했던 것으로 보입니다.

+0

이것은 작동하지 않습니다. 첫 번째 "sometext"를 캡처 한 후 두 번째 텍스트를 캡처하지만 그 이상은 수행하지 않습니다. –

+0

예, 실행했습니다. 루프에서 cap(). 그 버릇을 잊어 버렸어. ;-(설명서에 더 잘 설명되어 있습니다 : http://doc.qt.nokia.com/latest/qregexp.html#capturing-text – Mark

0

오직
개의 표현식을 사용하여 가변 개수의 캡처를 지정할 수있는 .Net 만 알고 있습니다. 예 - (capture. * me) +
반복 처리 가능한 캡처 개체를 만듭니다. 그럼에도 불구하고 그것은 단지 다른 모든 regex 엔진이 제공하는
을 시뮬레이트합니다.

대부분의 엔진은
루프 내에서 일치하는 항목이 없어 질 때까지 증분 일치를 제공합니다. global 플래그는 엔진에 마지막으로
sucessfull 일치가 중단 된 부분부터 일치를 유지하도록 지시합니다. (펄)

예 : ","

([^,]+?)(,|$) 

이 혼수로 끝나는 문자열과 일치하는 것 또는 :

while ($string =~ /([^,]+)/g) { print $1,"\n" }

관련 문제