2009-10-16 1 views
0

펄에서 잘 작동 다음과 같은 정규 표현식이 있습니다QRegexp idiosyncracies (perl과 비교) : 게으른 수량 한정자없이이 regexp을 작성하려면 어떻게해야합니까?

Classification:\s([^\n]+?)(?:\sRange:\s([^\n]+?))*(?:\sStructural Integrity:\s([^\n]+))*\n 

이 문자열에 일치하도록되어 데이터 형식의 유형은 다음과 같습니다

Classification: Class Name  Range: xxxx  Structural Integrity: value 
Classification: Class Name Structural Integrity: value 
Classification: Class Name 

즉 다음 "범위"와 "구조 무결성"필드는 선택 사항입니다. 따라서 원하는 결과는 다음과 같습니다.

{ 
$& [Classification: Class Name Range: xxxx Structural Integrity: value ] 
$1 [Class Name ] 
$2 [xxxx ] 
$3 [value ] 

$& [Classification: Class Name Structural Integrity: value ] 
$1 [Class Name ] 
$2 [value ] 

$& [Classification: Class Name ] 
$1 [Class Name ] 
} 

표현식에? 게으른 한정어를 두 곳에서 사용합니다. Qt는 true로 설정하면, 표현이 정보 비 욕심

무장에 모든 한정사를 만드는 "최소한의"속성을 사용하는 대신이 연산자는 내 코드를 작성, QRegExp에 의해 지원되지 않습니다

QRegExp rx("Classification:\\s([^\\n]+)(?:\\sRange:\\s([^\\n]+))*(?:\\sStructural Integrity:\\s([^\\n]+))*\\n"); 
rx.setMinimal(true); 

그러나 결과가 정확하지 않으며 많은 조정을 한 후에 올바른 캡처를 얻을 수 없었습니다. 이것을 더 많은 코드와 적은 정규식으로 나눌 수 있습니까? 또는 게으른 연산자없이 다시 작성 하시겠습니까? 이 같은

+0

스타 트렉이나 뭐부터 욕심 한정사를 지원 QRegExp::RegExp2이있다? – hirschhornsalz

+0

아니 스타 트랙 .. 아니지만 그것은 공간 관련;) – Casey

답변

2

뭔가 : 그것은 콜론 나 단어 다음에 유효한 키 중 하나와 일치

QRegExp rx("(Classification|Range|Structural\\s+Integrity):|(\\S+)"); 
QStringList classification(); 
QStringList range(); 
QStringList integrity(); 

QStringList current = null; 

int pos; 
while ((pos = rx.indexIn(str, pos)) != -1) { 
    if (rx.cap(1) == null) { 
     if (current != null) { 
      current << rx.cap(2); 
     } 
    } 
    else if ("Classification".equals(rx.cap(1))) { 
     current = classification; 
    } 
    else if ("Range".equals(rx.cap(1))) { 
     current = range; 
    } 
    else if ("Structural Integrity".equals(rx.cap(1))) { 
     current = integrity; 
    } 
    pos += rx.matchedLength(); 
} 

. 키이면 현재 목록을 해당 목록으로 변경하십시오. 그렇지 않으면 단어를 현재 목록에 추가하십시오.

결국 classification, rangeintegrity 목록에 해당 키 다음에 나오는 단어가 포함됩니다. 전체 경기가 끝나면 참가할 수 있습니다 :

QString classificationString = classification.join(" "); 

키 순서는 상관 없습니다.

관련 문제