2016-11-07 2 views
0

방금 ​​QRegularExpression으로 전환하기 시작했습니다. 여러 구분 기호로 문자열을 토큰 화하는 데 사용하고 있습니다. 저는 놀라운 행동을 보았습니다. 그것은 저에게 버그 인 것처럼 보입니다. Windows에서 Qt 5.5.1을 사용하고 있습니다.QRegularExpression의 예기치 않은 동작

#include <QRegularExpression> 
#include <QString> 
#include <QtDebug> 

int main(int argc, char *argv[]) 
{ 
    Q_UNUSED (argc); 
    Q_UNUSED (argv); 
    QRegularExpression regex ("^ "); 

    qDebug() << "Expected: " << QString ("M 100").indexOf(regex); 
    qDebug() << "NOT expected:" << QString ("M 100").indexOf(regex, 1); 
    qDebug() << "Expected: " << QString (" 100").indexOf(regex); 

    QRegularExpression regex1 (" "); 
    qDebug() << "Expected: " << QString ("M 100").indexOf(regex1); 
} 

출력 :

Expected:  -1 
NOT expected: -1 
Expected:  0 
Expected:  1 

은 "같이 IndexOf"통화 0 이외의 시작 위치이다 사용할 캐럿 (^)를 사용 여기

샘플 코드의 표현이 일치하지 못하게합니다. 직관적으로, 나는 캐럿이 내가 지정한 위치의 문자열과 일치 할 것으로 예상했다. 대신, 그것은 단순히 결코 일치하지 않습니다.

이 문제를 피하기 위해 splitRref를 사용하도록 토큰 화를 전환 할 것입니다. 어쨌든이 방법은 아마도 약간 더 깨끗한 편이지만 올바른 동작인지 또는 Qt에 버그를보고해야 하는지를 이해해야합니다.

업데이트 : 일부 토큰이 부동 소수점 숫자인지 확인하기 위해 정규 표현식을 사용해야하므로 splitRef를 사용하여 완전히 문제를 해결할 수없고 QStringRef와 함께 QRegularExpression을 사용할 수 없습니다. 그 가능성을 위해, 나는 QStringRef 토큰을 실제 QString으로 변환해야하는데, 그것은 내가 처음에 피하려고했던 것이었다.

+1

음,^문자열의 첫 번째 문자와 일치하고, 1 – infixed

답변

1

^는 여러 모드에서 줄 바꿈 할 때 후 주제 문자열, 또는 의 시작 부분에 일치합니다. 오프셋은 이러한 의미를 변경하지 않습니다. 따라서 /^ / (정규식 표기)을 M 100 (오프셋 1)과 일치 시키면 올바르게 일치하지 않습니다.

아마도 \G을 원하십니까? pcrepattern(3)에서 : 제목에 일치하는 첫 번째 위치에

\G 일치

startoffset에 의해 지정된 현재 일치하는 위치가, 경기의 시작 지점 인 경우에만 \G 주장은 사실이다 인수는 pcre_exec()입니다. 시작 오프셋의 값이 0이 아닌 경우 \A과 다릅니다. 그와

,이 코드 :

QRegularExpression regex ("\\G "); 

qDebug() << "Expected: " << QString ("M 100").indexOf(regex); 
qDebug() << "NOT expected:" << QString ("M 100").indexOf(regex, 1); 
qDebug() << "Expected: " << QString (" 100").indexOf(regex); 

인쇄

Expected:  -1 
NOT expected: 1 
Expected:  0 
+0

감사합니다 첫 번째 문자가 아닌 오프셋. 나는 이전의 매치 포지션에서 시작하지 않았기 때문에 \ G 단정에 대해 생각하지 않았지만, 그것은 의미가있다. 이것이 Qt 문서에 명시 적으로 언급 되었다면 좋았을 것입니다. 그러나 Perl의 동작을 알고 있습니다. 도움을 감사하십시오. – goug

+0

글쎄, Perl과 동일하다.'perl -E '$ _ = "M 100"; pos() = 1;/\ G /; ''(prints 1)라고하면 $ - [0]이라고 말하십시오. – peppe

+0

Perl에서 알고 있더라도 이것을 사용하는 것이 명백하지 않다고 말하고 있습니다. 오늘은 꽤 많은 시간을 들여야합니다. 그리하여 놓치기 쉬운 것이기 때문에 \ G 단언은 다른 옵션처럼 일반적으로 알려져 있지 않습니다. 팁을 Qt 문서에 포함시키는 것이 좋았을 것입니다 . – goug