QRegExp Class
QRegExp 클래스는 정규식을 사용하여 패턴 일치를 수행합니다. 더 보기...
| 헤더: | #include <QRegExp> |
| CMake: | find_package(Qt6 REQUIRED COMPONENTS Core5Compat) target_link_libraries(mytarget PRIVATE Qt6::Core5Compat) |
| qmake: | QT += core5compat |
- 상속된 멤버를 포함한 모든 멤버 목록
- QRegExp는 암시적 공유 클래스의 일부입니다.
참고: 이 클래스의 모든 함수는 재진입 가능합니다.
공개 유형
| enum | CaretMode { CaretAtZero, CaretAtOffset, CaretWontMatch } |
| enum | PatternSyntax { RegExp, RegExp2, Wildcard, WildcardUnix, FixedString, W3CXmlSchema11 } |
공개 함수
| QRegExp() | |
| QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp) | |
| QRegExp(const QRegExp &rx) | |
| ~QRegExp() | |
| QString | cap(int nth = 0) const |
| int | captureCount() const |
| QStringList | capturedTexts() const |
| Qt::CaseSensitivity | caseSensitivity() const |
| int | countIn(const QString &str) const |
| QString | errorString() const |
| bool | exactMatch(const QString &str) const |
| QStringList | filterList(const QStringList &stringList) const |
| int | indexIn(const QStringList &list, int from) const |
| int | indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const |
| bool | isEmpty() const |
| bool | isMinimal() const |
| bool | isValid() const |
| int | lastIndexIn(const QStringList &list, int from) const |
| int | lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const |
| int | matchedLength() const |
| QString | pattern() const |
| QRegExp::PatternSyntax | patternSyntax() const |
| int | pos(int nth = 0) const |
| QString | removeIn(const QString &str) const |
| QString | replaceIn(const QString &str, const QString &after) const |
| QStringList | replaceIn(const QStringList &stringList, const QString &after) const |
| void | setCaseSensitivity(Qt::CaseSensitivity cs) |
| void | setMinimal(bool minimal) |
| void | setPattern(const QString &pattern) |
| void | setPatternSyntax(QRegExp::PatternSyntax syntax) |
| QStringList | splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const |
| void | swap(QRegExp &other) |
| operator QVariant() const | |
| bool | operator!=(const QRegExp &rx) const |
| QRegExp & | operator=(QRegExp &&other) |
| QRegExp & | operator=(const QRegExp &rx) |
| bool | operator==(const QRegExp &rx) const |
정적 공용 멤버
| QString | escape(const QString &str) |
관련 비멤버
| size_t | qHash(const QRegExp &key, size_t seed = 0) |
| QDataStream & | operator<<(QDataStream &out, const QRegExp ®Exp) |
| QDataStream & | operator>>(QDataStream &in, QRegExp ®Exp) |
상세 설명
이 클래스는 Qt 6에서 더 이상 사용되지 않습니다. 새로운 코드를 작성할 때는 대신 QRegularExpression 를 사용해 주십시오. 기존 코드를 QRegExp에서 QRegularExpression 로 이식하는 방법에 대한 지침은 Porting to QRegularExpression 를 참조하십시오.
정규 표현식(regexp)은 텍스트 내의 부분 문자열을 일치시키는 패턴입니다. 이는 다음과 같은 다양한 상황에서 유용하게 사용됩니다. 예를 들어,
| 유효성 검사 | 정규 표현식을 사용하면 부분 문자열이 특정 기준(예: 정수인지, 공백이 포함되지 않았는지 등)을 충족하는지 확인할 수 있습니다. |
| 검색 | 정규 표현식은 단순한 부분 문자열 일치보다 더 강력한 패턴 일치 기능을 제공합니다. 예를 들어, 'mail', 'letter', 'correspondence' 중 하나의 단어는 일치시키되, 'email', 'mailman', 'mailer', 'letterbox' 등은 일치시키지 않도록 할 수 있습니다. |
| 검색 및 바꾸기 | 정규 표현식을 사용하면 부분 문자열이 나타나는 모든 위치를 다른 부분 문자열로 바꿀 수 있습니다. 예를 들어, & 뒤에 이미 amp;가 오는 경우를 제외하고 &가 나타나는 모든 위치를 & 로 바꿀 수 있습니다. |
| 문자열 분할 | 정규 표현식을 사용하여 문자열을 어디에서 분할해야 하는지 식별할 수 있습니다. 예를 들어, 탭으로 구분된 문자열을 분할하는 경우입니다. |
정규 표현식에 대한 간략한 소개, Qt의 정규 표현식 언어에 대한 설명, 몇 가지 예제 및 함수 문서 자체가 제공됩니다. QRegExp는 Perl의 정규 표현식 언어를 모델로 합니다. 유니코드를 완벽하게 지원합니다. QRegExp는 명령줄 셸에서 볼 수 있는 기능과 유사한, 더 간단한 와일드카드 모드에서도 사용할 수 있습니다. QRegExp에서 사용하는 구문 규칙은 ` setPatternSyntax()`를 통해 변경할 수 있습니다. 특히, 패턴 구문을 ` QRegExp::FixedString`로 설정할 수 있는데, 이는 일치시킬 패턴이 일반 문자열로 해석된다는 것을 의미합니다. 즉, 특수 문자(예: 백슬래시)가 이스케이프 처리되지 않습니다.
정규 표현식에 관한 훌륭한 서적으로는 제프리 E. F. 프리들(Jeffrey E. F. Friedl)의 『 Mastering Regular Expressions 』(제3판, ISBN 0-596-52812-4)이 있습니다.
참고: Qt5에서는 새로운 ` QRegularExpression ` 클래스가 Perl과 호환되는 정규 표현식 구현을 제공하며, `QRegExp` 대신 이 클래스를 사용하는 것이 권장됩니다.
보안 고려 사항
QRegExp는 패턴이 소비할 수 있는 리소스에 대한 제한을 두지 않으며, 내부 버퍼의 크기가 오버플로우될 수 있습니다. 따라서 비교적 작은 특수 제작된 패턴만으로도 사용 가능한 메모리를 모두 소모하거나, 스택 오버플로가 발생하거나, 메모리가 손상될 수 있습니다. 이러한 현상은 패턴이 컴파일되는 동안, 즉 패턴이 할당되는 즉시 발생하며, 텍스트가 일치할 필요는 없습니다. 내부적으로 정규 표현식으로 변환되는 wildcard 패턴에도 동일한 사항이 적용됩니다.
신뢰할 수 있는 출처의 패턴에 대해서만 QRegExp를 사용하십시오. 대신, 일치 처리에 소모되는 리소스를 제한하는 QRegularExpression 를 사용하는 것이 좋습니다.
소개
정규 표현식은 표현식, 수량자 및 어설션으로 구성됩니다. 가장 간단한 표현식은 문자이며, 예를 들어 x나 5와 같습니다. 표현식은 대괄호로 묶인 문자 집합일 수도 있습니다. [ABCD]는 A, B, C 또는 D와 일치합니다. 이 표현식은 [A-D]로도 쓸 수 있으며, 영어 알파벳의 대문자 중 아무 것과나 일치하는 표현식은 [A-Z]로 작성됩니다.
양정자는 일치해야 하는 표현식의 발생 횟수를 지정합니다. x{1,1}은 정확히 하나의 x와 일치함을 의미합니다. x{1,5}는 x가 적어도 하나 이상, 최대 다섯 개까지 포함된 x 문자 시퀀스와 일치함을 의미합니다.
일반적으로 정규 표현식을 사용하여 괄호나 태그의 균형을 확인할 수는 없다는 점에 유의하십시오. 예를 들어, <b> 태그가 중첩되지 않은 경우, 시작 태그인 html <b> 와 종료 태그인 </b> 을 일치시키는 정규식을 작성할 수 있습니다. 그러나 <b> 태그가 중첩된 경우, 동일한 정규식은 시작 태그인 <b> 와 잘못된 종료 태그인 </b> 을 일치시킬 것입니다. <b>bold <b>bolder</b></b> 라는 조각의 경우, 첫 번째 <b> 이 첫 번째 </b> 와 일치하게 되는데, 이는 올바르지 않습니다. 그러나 중첩된 괄호나 태그를 올바르게 일치시키는 정규식을 작성하는 것은 가능합니다. 단, 중첩 수준이 고정되어 있고 알려져 있는 경우에만 가능합니다. 중첩 수준이 고정되어 있지 않고 알려져 있지 않다면, 오류 없이 작동하는 정규식을 작성하는 것은 불가능합니다.
0에서 99 사이의 정수를 일치시키는 정규식을 만들려고 한다고 가정해 봅시다. 적어도 하나의 자릿수가 필요하므로, 단일 자릿수를 정확히 한 번 일치시키는 [0-9]{1,1}이라는 표현으로 시작합니다. 이 정규식은 0에서 9 사이의 정수와 일치합니다. 99까지의 정수를 일치시키려면 최대 발생 횟수를 2로 늘려야 하므로, 정규 표현식은 [0-9]{1,2}가 됩니다. 이 정규 표현식은 0부터 99까지의 정수를 일치시켜야 한다는 원래 요구 사항을 충족하지만, 문자열 중간에 나타나는 정수도 일치시키게 됩니다. 일치하는 정수가 문자열 전체가 되도록 하려면 앵커 어설션인 ^ (캐럿)과 $ (달러)를 사용해야 합니다. 정규 표현식의 첫 번째 문자가 ^인 경우, 해당 정규 표현식은 문자열의 시작 부분부터 일치해야 함을 의미합니다. $가 정규 표현식의 마지막 문자인 경우, 정규 표현식은 문자열의 끝까지 일치해야 함을 의미합니다. 이 경우 정규 표현식은 ^[0-9]{1,2}$가 됩니다 . ^나 $와 같은 앵커는 문자가 아니라 문자열 내의 위치를 일치시킨다는 점에 유의하십시오 .
다른 곳에서 정규 표현식을 본 적이 있다면, 여기 표시된 것과는 다르게 보였을 수도 있습니다. 이는 일부 문자 집합과 양화자가 매우 흔히 사용되기 때문에 이를 나타내는 특수 기호가 지정되어 있기 때문입니다. [0-9] 는 기호 \d로 대체할 수 있습니다. 정확히 한 번만 일치시키는 양정자 {1,1}은 해당 표현식 자체로 대체할 수 있습니다. 즉, x{1,1} 은 x와 동일합니다. 따라서 0부터 99까지 일치시키는 표현식은 ^\d{1,2}$로 작성할 수 있습니다 . 또한 ^\d\d {0,1}$로 표기할 수도 있습니다. 즉 , 문자열의 시작 부분에서 한 자리 숫자를 매칭하고, 그 뒤에 0개 또는 1개의 숫자가 바로 이어지도록 매칭합니다. 실제로는 ^\d\d?$로 표기됩니다 . ‘? ’는 양정자 {0,1}, 즉 0회 또는 1회 출현을 나타내는 약어입니다. ‘? ’는 표현식을 선택적으로 만듭니다. 정규 표현식 ^\d\d ?$는 문자열의 시작 부분에서 한 자리 숫자를 찾은 뒤, 그 바로 뒤에 0개 또는 1개의 숫자가 더 이어지고, 그 바로 뒤에 문자열의 끝이 오도록 일치시킵니다.
'mail' , 'letter' 또는 'correspondence' 중 하나와 일치하지만, 이 단어들을 포함하는 단어(예: 'email', 'mailman', 'mailer', 'letterbox')와는 일치하지 않는 정규식을 작성하려면, 'mail'과 일치하는 정규식으로 시작하십시오. 완전히 표현하면 이 정규식은 m{1,1}a{1,1}i{1,1}l{1,1}이 되지만, 문자 표현식은 자동으로 {1,1}로 수량화되므로, 정규식을 mail, 즉 ‘m’ 뒤에 ‘a’, 그 뒤에 ‘i’, 그 뒤에 ‘l’이 오는 형태로 단순화할 수 있습니다. 이제 '또는'을 의미하는 수직 막대 |를 사용하여 나머지 두 단어를 포함시킬 수 있으므로, 세 단어 중 어느 하나와도 일치하는 정규 표현식은 mail|letter|correspondence가 됩니다. 'mail' , 'letter' 또는 'correspondence'와 일치합니다. 이 정규 표현식은 우리가 일치시키고자 하는 세 단어 중 하나와 일치하겠지만, 'email'과 같이 일치시키고 싶지 않은 단어도 함께 일치시킬 것입니다. 정규 표현식이 원치 않는 단어와 일치하는 것을 방지하려면, 단어 경계에서 일치를 시작하고 끝내도록 지정해야 합니다. 먼저 정규식을 괄호로 묶습니다: (mail|letter|correspondence). 괄호는 표현식을 그룹화하며, 우리가 capture 하고 싶은 정규식의 일부를 식별합니다. 표현식을 괄호로 묶으면 더 복잡한 정규식에서 이를 구성 요소로 사용할 수 있습니다. 또한 세 단어 중 실제로 어떤 단어가 일치했는지 확인할 수 있게 해줍니다. 일치를 단어 경계에서 시작하고 끝내도록 강제하려면 정규식을 \b단어 경계 어설션( word boundary assertions)으로 감쌉니다: \b(mail|letter|correspondence)\b. 이제 이 정규 표현식은 '단어 경계를 매칭한 뒤, 괄호 안의 정규 표현식을 매칭하고, 다시 단어 경계를 매칭한다'는 의미를 갖습니다. \b 어정(assertion)은 문자 자체가 아니라 정규 표현식 내의 위치를 일치시킵니다. 단어 경계란 공백, 줄바꿈, 또는 문자열의 시작이나 끝과 같이 단어가 아닌 모든 문자를 말합니다.
앰퍼샌드 문자를 HTML 엔티티 &로 바꾸려면, 일치시킬 정규 표현식은 단순히 &입니다. 하지만 이 정규 표현식은 이미 HTML 엔티티로 변환된 앰퍼샌드도 일치시킵니다. 우리는 이미 'amp;'가 뒤따르지 않는 앰퍼샌드만 치환하고자 합니다. 이를 위해서는 부정 선행 검사 조건 (?!__)이 필요합니다. 그러면 정규 표현식은 &(?!amp;)로 작성할 수 있습니다. 즉 , 뒤에 'amp; '가 따르지 않는 앰퍼샌드를 일치시킵니다.
문자열에서 'Eric'과 'Eirik'이 나타나는 모든 횟수를 세고 싶다면, 두 가지 유효한 해결책은 \b(Eric|Eirik)\b 와 \bEi?ri[ck]\b 입니다. '\b' 단어 경계 조건은 'Ericsson'과 같이 두 이름 중 하나를 포함하는 단어가 일치하는 것을 방지하기 위해 필요합니다. 두 번째 정규 표현식은 'Eric', 'Erik', 'Eiric', 'Eirik' 등 우리가 원하는 것보다 더 많은 철자 변형을 일치시킨다는 점에 유의하십시오.
위에서 논의한 예시 중 일부는 ‘ code examples ’ 섹션에서 구현되어 있습니다.
문자 집합을 나타내는 문자와 약어
| 요소 | 의미 |
|---|---|
| c | 문자는 정규 표현식에서 특별한 의미가 없는 한, 그 문자 자체를 나타냅니다. 예: c는 문자 c와 일치합니다. |
| \c | 백슬래시 뒤에 오는 문자는 아래에 명시된 경우를 제외하고 그 문자 자체와 일치합니다. 예: 문자열의 시작 부분에 리터럴 캐럿을 일치시키려면 \^를 작성합니다. |
| \a | ASCII 벨(BEL, 0x07)과 일치합니다. |
| \f | ASCII 양식 진도(FF, 0x0C)와 일치합니다. |
| \n | ASCII 줄 바꿈(LF, 0x0A, 유닉스 줄 바꿈)과 일치합니다. |
| \r | ASCII 캐리지 리턴(CR, 0x0D)과 일치합니다. |
| \t | ASCII 수평 탭(HT, 0x09)과 일치합니다. |
| \v | ASCII 수직 탭(VT, 0x0B)과 일치합니다. |
| \xhhhh | 16진수 hhhh (0x0000~0xFFFF 사이)에 해당하는 유니코드 문자와 일치합니다. |
| \0ooo (예: \zero ooo) | 8진수 ooo (0에서 0377 사이)에 해당하는 ASCII/Latin1 문자와 일치합니다. |
| . (점) | 모든 문자(줄 바꿈 포함)와 일치합니다. |
| \d | 숫자(QChar::isDigit())와 일치합니다. |
| \D | 숫자가 아닌 문자와 일치합니다. |
| \s | 공백 문자와 일치합니다 (QChar::isSpace()). |
| \S | 공백 문자가 아닌 문자와 일치합니다. |
| \w | 단어 문자를 일치시킵니다(QChar::isLetterOrNumber(), QChar::isMark() 또는 '_'). |
| \W | 단어가 아닌 문자를 일치시킵니다. |
| \n | n번째 역참조, 예: \1, \2 등. |
참고: C++ 컴파일러는 문자열 내의 백슬래시를 변환합니다. 정규 표현식에 \ 를 포함시키려면 이를 두 번 입력해야 합니다(예: \\). 백슬래시 문자 자체를 일치시키려면 이를 네 번 입력해야 합니다(예: \\\\).
문자 집합
대괄호는 대괄호 안에 포함된 모든 문자와 일치함을 의미합니다. 앞서 설명한 문자 집합 약어는 대괄호로 묶인 문자 집합 내에 나타날 수 있습니다. 문자 집합 약어와 다음 두 가지 예외를 제외하고, 대괄호 안의 문자는 특별한 의미를 가지지 않습니다.
| ^ | 캐럿 기호는 첫 번째 문자(즉, 여는 대괄호 바로 뒤)로 나타날 경우 해당 문자 집합을 부정합니다. [abc] 는 'a', 'b' 또는 'c'와 일치하지만, [^abc]는 'a', 'b' 또는 'c'를 제외한 모든 문자와 일치합니다. |
| - | 대시는 문자 범위를 나타냅니다. [W-Z] 는 'W', 'X', 'Y' 또는 'Z'와 일치하지만, [^W-Z] 는 'W', 'X', 'Y' 또는 'Z'를 제외한 모든 문자와 일치합니다. |
플랫폼과 언어에 관계없이 미리 정의된 문자 집합 약어를 사용하는 것이 문자 범위를 사용하는 것보다 호환성이 더 높습니다. 예를 들어, [0-9]는 서양 알파벳의 숫자와 일치하지만 \d어떤 알파벳의 숫자라도 일치시킵니다.
참고: 다른 정규식 문서에서는 문자 집합을 흔히 "문자 클래스"라고 부릅니다.
수량자
기본적으로 표현식은 {1,1}로 자동 양화되며, 즉 정확히 한 번만 나타나야 합니다. 다음 목록에서 E는 표현식을 의미합니다. 표현식은 문자, 문자 집합의 약어, 대괄호로 묶인 문자 집합, 또는 괄호로 묶인 표현식입니다.
| E? | E가 0회 또는 1회 나타나는 것과 일치합니다. 이 양화자는 ‘이전 표현식이 선택 사항’임을 의미합니다. 즉, 해당 표현식이 발견되든 안 되든 상관없이 일치하기 때문입니다. E? 는 E{0,1}과 동일합니다. 예를 들어, dents? 는 'dent' 또는 'dents'와 일치합니다. |
| E+ | E가 한 번 이상 나타나는 경우와 일치합니다. E+는 E{1,}과 동일합니다. 예: 0+는 '0', '00', '000' 등과 일치합니다. |
| E* | E가 0개 이상 나타나는 경우를 일치시킵니다. 이는 E{0,}와 동일합니다. * 양화자는 종종 +를 사용해야 할 상황에서 잘못 사용되곤 합니다. 예를 들어, 표현식에서 공백으로 끝나는 문자열을 일치시키기 위해 ` \s*$ `를 사용하면 모든 문자열과 일치하게 됩니다. 왜냐하면 `\s*$` 는 '0개 이상의 공백 뒤에 문자열 끝이 오는 경우'를 의미하기 때문입니다. 끝부분에 공백 문자가 하나 이상 있는 문자열을 일치시키는 올바른 정규 표현식은 `\s+$`입니다 . |
| E{n} | E가 정확히 n번 나오는 것을 일치시킵니다. E{n}은 E를 n번 반복하는 것과 같습니다. 예를 들어, x{5}는 xxxxx와 같습니다. 또한 E{n,n}과도 동일하며, x{5,5}가 그 예입니다. |
| E{n,} | E가 n번 이상 나타나는 경우와 일치합니다. |
| E{,m} | E가 최대 m번 나타나는 경우를 일치시킵니다. E{,m}은 E{0,m}과 동일합니다. |
| E{n,m} | E가 최소 n번, 최대 m번 나타나는 경우와 일치합니다. |
양화자를 바로 앞의 문자에만 적용하지 않으려면, 괄호를 사용하여 표현식 내의 문자들을 그룹화하십시오. 예를 들어, tag+는 't' 뒤에 'a'가 오고 그 뒤에 적어도 하나의 'g'가 오는 경우를 일치시키는 반면, (tag)+는 'tag'가 적어도 한 번 나타나는 경우를 일치시킵니다.
참고: 수량자는 일반적으로 "탐욕적(greedy)"입니다. 수량자는 항상 가능한 한 많은 텍스트를 일치시킵니다. 예를 들어, 0+는 처음 발견한 0과 그 뒤에 이어지는 모든 0을 일치시킵니다. '20005'에 적용하면'20005'와일치합니다. 수량자는 비탐욕적으로 설정할 수 있습니다. 자세한 내용은 setMinimal()을 참조하십시오.
텍스트 캡처
괄호를 사용하면 요소를 그룹화하여 수량화하거나 캡처할 수 있습니다. 예를 들어, 문자열과 일치하는 표현식 mail|letter|correspondence가 있다면, 단어 중 하나가 일치했다는 것은 알 수 있지만 정확히 어떤 단어인지는 알 수 없습니다. 괄호를 사용하면 괄호 안의 범위 내에서 일치된 내용을 “캡처”할 수 있습니다. 따라서 (mail|letter|correspondence) 를 사용하고 이 정규식을 “I sent you some email”이라는 문자열에 대입하여 일치시킨 경우, cap() 또는 capturedTexts() 함수를 사용하여 일치된 문자, 이 경우 ‘mail’을 추출할 수 있습니다.
정규 표현식 내부에서도 캡처된 텍스트를 사용할 수 있습니다. 캡처된 텍스트를 참조하려면 cap()과 마찬가지로 1부터 인덱싱되는 역참조(backreference)를 사용합니다. 예를 들어, \b(\w+)\W+\1\b 을 사용하여 문자열에서 중복된 단어를 검색할 수 있습니다. 이는 단어 경계를 일치시킨 후, 하나 이상의 단어 문자가 오고, 그 뒤에 하나 이상의 비단어 문자가 오며, 첫 번째 괄호 표현식과 동일한 텍스트가 오고, 마지막으로 단어 경계가 오는 패턴을 의미합니다.
괄호를 캡처가 아닌 순수한 그룹화 목적으로만 사용하려면 비캡처 구문을 사용할 수 있습니다(예: (?:green|blue)). 비캡처 괄호는 '(?:'로 시작하고 ')'로 끝납니다. 이 예제에서는 'green' 또는 'blue' 중 하나를 일치시키지만, 일치 결과를 캡처하지 않으므로 일치 여부만 알 수 있고 실제로 어떤 색이 발견되었는지는 알 수 없습니다. 비캡처 괄호를 사용하는 것이 캡처 괄호를 사용하는 것보다 효율적입니다. 정규식 엔진이 처리해야 할 작업량이 줄어들기 때문입니다.
캡처 괄호와 비캡처 괄호 모두 중첩될 수 있습니다.
역사적인 이유로, 캡처 괄호에 적용되는 양정자(예: *)는 다른 양정자보다 더 “탐욕적”입니다. 예를 들어, a*(a*) 는 cap(1) == "aaa"인 경우 "aaa"와 일치합니다. 이 동작은 다른 정규식 엔진(특히 Perl)의 동작과는 다릅니다. 보다 직관적인 캡처 동작을 얻으려면 QRegExp 생성자에 QRegExp::RegExp2 를 지정하거나 setPatternSyntax(QRegExp::RegExp2)를 호출하십시오.
일치하는 개수를 미리 알 수 없는 경우, 루프 내에서 ` cap()`를 사용하는 것이 일반적인 방법입니다. 예를 들어:
QRegExp rx("(\\d+)");
QString str = "Offsets: 12 14 99 231 7";
QStringList list;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
list << rx.cap(1);
pos += rx.matchedLength();
}
// list: ["12", "14", "99", "231", "7"]주장
어설션은 정규식 내에서 나타나는 위치에 있는 텍스트에 대해 어떤 진술을 하지만, 어떤 문자도 일치시키지는 않습니다. 다음 목록에서 E는 임의의 표현을 의미합니다.
| ^ | 캐럿(^)은 문자열의 시작을 나타냅니다. 리터럴 ' ^ '을 일치시키려면 \\^ 와 같이 이스케이프 처리해야 합니다. 예를 들어, ^#include는 '#include'로 시작하는 문자열에만 일치합니다. (캐럿이 문자 집합의 첫 번째 문자인 경우 특별한 의미를 가지며, 자세한 내용은 Sets of Characters 를 참조하십시오.) |
| $ | 달러 기호는 문자열의 끝을 나타냅니다. 예를 들어 , `\d\s *$ `는 숫자로 끝나고 그 뒤에 공백이 올 수도 있는 문자열과 일치합니다. 리터럴 ` $ `와 일치시키려면 ` \\$`와 같이 에스케이프 처리해야 합니다. |
| \b | 단어 경계. 예를 들어, 다음 정규 표현식 \bOK\b 는 단어 경계(예: 문자열 시작 또는 공백) 바로 뒤에 오는 문자 'O', 그 다음 또 다른 단어 경계(예: 문자열 끝 또는 공백) 바로 앞에 오는 문자 'K'를 일치시킵니다. 하지만 이 조건은 실제로 공백을 일치시키지 않으므로, (\bOK\b ) 를 작성했을 때 일치가 발생하더라도 문자열이 "It's OK now"라 하더라도 일치 결과에는 'OK'만 포함됩니다. |
| \B | 단어 경계가 아닌 경우. 이 어설션은 다음 조건이 충족될 때 참입니다. \b 에서 거짓인 곳이라면 어디서나 참입니다. 예를 들어 \Bon\B "Left on"에서 검색하면 일치에 실패하지만(공백과 문자열 끝은 비단어 경계가 아니기 때문), "tonne"에서는 일치합니다. |
| (?=E) | 양방향 선행 검사. 이 어설션은 정규 표현식의 해당 지점에서 표현식이 일치할 때 참입니다. 예를 들어, const(?=\s+char)는 'static const char *'에서와 같이 그 뒤에 'char'가 올 때마다 'const'와 일치합니다. (이는 'static const char *'와 일치하는 const\s+char와 비교해 보십시오.) |
| (?!E) | 부정 선검색. 이 어설션은 정규 표현식의 해당 지점에서 표현식이 일치하지 않을 때 참입니다. 예를 들어, const(?!\s+char) 는 뒤따르는 문자가 'char'인 경우를 제외하고 'const'와 일치합니다. |
와일드카드 일치
bash나 cmd.exe와 같은 대부분의 명령줄 셸은 와일드카드를 사용하여 파일 그룹을 식별하는 기능인 “파일 글로빙”을 지원합니다. setPatternSyntax() 함수는 정규 표현식 모드와 와일드카드 모드 사이를 전환하는 데 사용됩니다. 와일드카드 일치는 완전한 정규 표현식보다 훨씬 간단하며, 다음 네 가지 기능만 있습니다:
| c | 아래에 언급된 문자를 제외하고는 모든 문자가 그 자체를 나타냅니다. 따라서 c는 문자 c와 일치합니다. |
| ? | 임의의 단일 문자와 일치합니다. 이는 완전한 정규 표현식에서 . 과 동일합니다. |
| * | 임의의 문자를 0개 이상 일치시킵니다. 전체 정규 표현식에서 .* 와 동일합니다. |
| [...] | 문자 집합은 일반 정규 표현식과 마찬가지로 대괄호([])로 나타낼 수 있습니다. 문자 클래스 내부에서도 외부와 마찬가지로 백슬래시(\)는 특별한 의미를 가지지 않습니다. |
'와일드카드(Wildcard)' 모드에서는 와일드카드 문자를 이스케이프할 수 없습니다. '와일드카드 이스케이프( WildcardUnix)' 모드에서는 '\' 문자가 와일드카드를 이스케이프합니다.
예를 들어 와일드카드 모드에서 파일 이름이 포함된 문자열을 처리할 때, *.html을 사용하여 HTML 파일을 식별할 수 있습니다. 이는 0개 이상의 문자가 온 뒤 점(.)이 오고, 그 뒤에 'h', 't', 'm', 'l'이 오는 패턴과 일치합니다.
문자열을 와일드카드 표현식과 비교하려면 exactMatch()을 사용합니다. 예를 들어:
QRegExp rx("*.txt");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("README.txt"); // returns true
rx.exactMatch("welcome.txt.bak"); // returns falsePerl 사용자를 위한 참고 사항
Perl에서 지원하는 대부분의 문자 클래스 약어는 QRegExp에서도 지원됩니다. 자세한 내용은 characters and abbreviations for sets of characters 을 참조하십시오.
QRegExp에서는 문자 클래스 내부를 제외하고, ^ 는 항상 문자열의 시작을 의미하므로, 해당 목적으로 사용되지 않는 한 캐럿 기호는 반드시 이스케이프 처리해야 합니다. Perl에서는 캐럿 기호의 의미가 나타나는 위치에 따라 자동으로 달라지므로 이스케이프 처리가 필요한 경우는 거의 없습니다. $ 도 마찬가지이며, QRegExp에서는 항상 문자열의 끝을 의미합니다.
QRegExp의 양화자는 Perl의 탐욕적 양화자와 동일합니다(단, note above 참조). 비탐욕적 일치는 개별 양화자에는 적용할 수 없지만, 패턴 내의 모든 양화자에는 적용할 수 있습니다. 예를 들어, Perl 정규식 ro+?m과 일치시키려면 다음과 같이 작성해야 합니다:
QRegExp rx("ro+m");
rx.setMinimal(true);Perl의 /i 옵션에 해당하는 것은 setCaseSensitivity 입니다 (Qt::CaseInsensitive).
Perl의 ` /g ` 옵션은 ` loop`을 사용하여 에뮬레이션할 수 있습니다.
QRegExp에서 . 는 모든 문자를 일치시키므로, 모든 QRegExp 정규 표현식은 Perl의 /s 옵션과 동등한 기능을 갖습니다. QRegExp에는 Perl의 /m 옵션에 해당하는 기능이 없지만, 입력을 줄 단위로 분할하거나 줄바꿈을 검색하는 정규 표현식을 사용하여 반복 처리하는 등 다양한 방법으로 이를 에뮬레이션할 수 있습니다.
QRegExp는 문자열 중심이므로, \A, \Z 또는 \z 어설션은 없습니다. \G 어설션은 지원되지 않지만, 루프를 통해 에뮬레이트할 수 있습니다.
Perl의 $&는 cap(0) 또는 capturedTexts()[0]에 해당합니다. $`, $' 또는 $+에 해당하는 QRegExp 표현식은 없습니다. Perl의 캡처 변수인 $1, $2, ...는 cap(1) 또는 capturedTexts()[1], cap(2) 또는 capturedTexts()[2] 등에 해당합니다.
패턴을 대체하려면 QString::replace()를 사용하십시오.
Perl의 확장된 /x 구문은 지원되지 않으며, (?i)와 같은 지시어나 (?#comment)와 같은 정규식 주석도 지원되지 않습니다. 반면, C++의 리터럴 문자열 규칙을 사용하면 동일한 결과를 얻을 수 있습니다:
QRegExp mark("\\b" // word boundary
"[Mm]ark" // the word we want to match
);0폭 양방향 선행 검사 어설션(?=pattern)과 0폭 음방향 선행 검사 어설션(?!pattern)은 모두 Perl과 동일한 구문으로 지원됩니다. 반면, Perl의 후행 검사 어설션, “독립적인” 하위 표현식 및 조건 표현식은 지원되지 않습니다.
비캡처 괄호도 동일한 (?:pattern) 구문을 사용하여 지원됩니다.
Perl의 split 및 join 함수와 동등한 기능에 대해서는 QString::split() 및 QStringList::join()을 참조하십시오.
참고: C++은 \ 문자를 변환하므로 코드에서는 이 문자를 두 번 작성해야 합니다. 예를 들어, \b\b 을 \ 으로 작성해야 합니다.
코드 예제
QRegExp rx("^\\d\\d?$"); // match integers 0 to 99
rx.indexIn("123"); // returns -1 (no match)
rx.indexIn("-6"); // returns -1 (no match)
rx.indexIn("6"); // returns 0 (matched at position 0)세 번째 문자열은'6'과 일치합니다. 이는 0부터 99까지의 정수를 검증하는 간단한 정규 표현식입니다.
QRegExp rx("^\\S+$"); // match strings without whitespace
rx.indexIn("Hello world"); // returns -1 (no match)
rx.indexIn("This_is-OK"); // returns 0 (matched at position 0)두 번째 문자열은'This_is-OK'와 일치합니다. 공백이 포함되지 않은 문자열을 일치시키기 위해 문자 집합 약어 '\S'(공백이 아닌 문자)와 앵커를 사용했습니다.
다음 예제에서는 'mail', 'letter' 또는 'correspondence'가 포함된 문자열과 일치시키지만, 전체 단어만 일치시킵니다. 즉, 'email'은 일치하지 않습니다.
QRegExp rx("\\b(mail|letter|correspondence)\\b");
rx.indexIn("I sent you an email"); // returns -1 (no match)
rx.indexIn("Please write the letter"); // returns 17두 번째 문자열은 "Please write the letter"와 일치합니다. 'letter'라는 단어도 (괄호 덕분에) 캡처됩니다. 다음과 같이 캡처된 텍스트를 확인할 수 있습니다:
QString captured = rx.cap(1); // captured == "letter"이렇게 하면 첫 번째 캡처 괄호 세트(왼쪽에서 오른쪽으로 왼쪽 캡처 괄호를 세는 기준) 안의 텍스트가 캡처됩니다. cap(0)은 일치한 정규식 전체를 가리키므로(대부분의 정규식 엔진에서 '&'와 동일), 괄호는 1부터 세게 됩니다.
QRegExp rx("&(?!amp;)"); // match ampersands but not &
QString line1 = "This & that";
line1.replace(rx, "&");
// line1 == "This & that"
QString line2 = "His & hers & theirs";
line2.replace(rx, "&");
// line2 == "His & hers & theirs"여기서는 QRegExp를 QString 의 replace() 함수에 전달하여, 일치한 텍스트를 새로운 텍스트로 대체했습니다.
QString str = "One Eric another Eirik, and an Ericsson. "
"How many Eiriks, Eric?";
QRegExp rx("\\b(Eric|Eirik)\\b"); // match Eric or Eirik
int pos = 0; // where we are in the string
int count = 0; // how many Eric and Eirik's we've counted
while (pos >= 0) {
pos = rx.indexIn(str, pos);
if (pos >= 0) {
++pos; // move along in str
++count; // count our Eric or Eirik
}
}indexIn() 함수를 사용하여 문자열 내에서 정규식을 반복적으로 일치시켰습니다. 한 번에 한 글자씩 앞으로 이동하는 방식 pos++ 대신, 이미 일치한 문자열을 건너뛰기 위해 pos += rx.matchedLength() 를 작성할 수도 있었다는 점에 유의하십시오. 카운트는 3이 되며, 'One Eric another Eirik, and an Ericsson. 'Eiriks, Eric?'의 개수는 몇 개일까요? 'Ericsson'이나 'Eiriks'는 비단어 경계로 둘러싸여 있지 않기 때문에 일치하지 않습니다.
정규 표현식의 일반적인 용도 중 하나는 구분 기호로 구분된 데이터 행을 구성 필드로 분할하는 것입니다.
str = "The Qt Company Ltd\tqt.io\tFinland";
QString company, web, country;
rx.setPattern("^([^\t]+)\t([^\t]+)\t([^\t]+)$");
if (rx.indexIn(str) != -1) {
company = rx.cap(1);
web = rx.cap(2);
country = rx.cap(3);
}이 예제에서 입력 행은 회사명, 웹 주소, 국가 순서로 구성되어 있습니다. 안타깝게도 이 정규 표현식은 다소 길고 유연성이 떨어집니다. 필드를 하나라도 더 추가하면 코드가 작동하지 않게 됩니다. 더 간단하고 나은 해결책은 구분자(이 경우 '\t')를 찾아 그 주변의 텍스트를 추출하는 것입니다. QString::split() 함수는 구분자 문자열이나 정규식을 인수로 받아 그에 따라 문자열을 분할할 수 있습니다.
QStringList field = str.split("\t");여기서 field[0]은 회사명, field[1]은 웹 주소 등을 나타냅니다.
셸의 일치 방식을 모방하려면 와일드카드 모드를 사용할 수 있습니다.
QRegExp rx("*.html");
rx.setPatternSyntax(QRegExp::Wildcard);
rx.exactMatch("index.html"); // returns true
rx.exactMatch("default.htm"); // returns false
rx.exactMatch("readme.txt"); // returns false와일드카드 일치는 간단하기 때문에 편리할 수 있지만, 모든 와일드카드 정규 표현식은 완전한 정규 표현식을 사용하여 정의할 수 있습니다(예: .*\.html$). 와일드카드를 사용하면 .html 과 .htm 파일을 모두 일치시킬 수 없다는 점에 유의하십시오. 'test.html.bak'도 일치시키는 *.htm*을 사용하지 않는 한 말이죠. 완전한 정규 표현식인 .*\.html?$를 사용하면 필요한 정밀도를 확보할 수 있습니다 .
QRegExp는 setCaseSensitivity()을 사용하여 대소문자를 구분하지 않고 일치시킬 수 있으며, setMinimal()을 사용하여 비탐욕적 일치를 수행할 수 있습니다. 기본적으로 QRegExp는 완전한 정규식을 사용하지만, setPatternSyntax()을 통해 이를 변경할 수 있습니다. 검색은 indexIn()을 사용하여 앞으로, lastIndexIn()을 사용하여 뒤로 수행할 수 있습니다. 캡처된 텍스트는 capturedTexts()을 사용하여 모든 캡처된 문자열의 문자열 목록을 반환받거나, cap()을 사용하여 지정된 인덱스에 해당하는 캡처된 문자열을 반환받을 수 있습니다. pos() 함수는 일치 인덱스를 받아 일치가 발생한 문자열 내의 위치를 반환합니다(일치가 없는 경우 -1을 반환합니다).
QRegularExpression으로의 이식
Qt 5에서 도입된 QRegularExpression 클래스는 Perl 호환 정규식을 구현하며, 제공되는 API, 지원되는 패턴 구문, 실행 속도 측면에서 QRegExp에 비해 크게 개선되었습니다. 가장 큰 차이점은 ` QRegularExpression `가 단순히 정규식을 보관할 뿐이며, 일치 요청 시 해당 정규식이 수정되지 않는다는 점입니다. 대신, 일치 결과를 확인하고 캡처된 부분 문자열을 추출하기 위해 ` QRegularExpressionMatch ` 객체가 반환됩니다. 이는 전역 일치 및 ` QRegularExpressionMatchIterator`에도 동일하게 적용됩니다.
그 밖의 차이점은 아래에 요약되어 있습니다.
참고: QRegularExpression 는 Perl 호환 정규 표현식에서 사용할 수 있는 모든 기능을 지원하지 않습니다. 가장 주목할 만한 점은 캡처 그룹에 대한 중복 이름이 지원되지 않으며, 이를 사용하면 정의되지 않은 동작이 발생할 수 있다는 것입니다. 이는 향후 Qt 버전에서 변경될 수 있습니다.
다른 패턴 구문
QRegExp의 정규 표현식을 QRegularExpression 로 이식하려면 패턴 자체를 수정해야 할 수도 있습니다.
특정 상황에서 QRegExp는 너무 관대하여, QRegularExpression 를 사용할 때 단순히 유효하지 않은 패턴을 허용하기도 했습니다. 이러한 패턴으로 생성된 QRegularExpression 객체는 유효하지 않으므로 이를 쉽게 감지할 수 있습니다( QRegularExpression::isValid() 참조).
다른 경우에는 QRegExp에서 QRegularExpression 으로 이식된 패턴이 의미론이 변경되었을 수 있습니다. 따라서 사용된 패턴을 검토해야 합니다. 눈에 띄는 비호환성 사례는 다음과 같습니다:
\xHHHH와 같이 2자리 이상의 16진수 이스케이프를 사용하려면 중괄호가 필요합니다.\x2022와 같은 패턴은\x{2022}로 이식해야 하며, 그렇지 않으면 공백(0x20) 뒤에"22"문자열이 오는 경우와도 일치하게 됩니다. 일반적으로, 지정된 자릿수에 관계없이\x이스케이프와 함께 항상 중괄호를 사용하는 것이 강력히 권장됩니다.{,n}와 같은 0~n 개 정량화 표현은 의미론을 보존하기 위해{0,n}로 변환해야 합니다. 그렇지 않으면\d{,3}와 같은 패턴이 숫자 뒤에 정확히"{,3}"라는 문자열이 오는 경우와 일치하게 됩니다.- QRegExp는 기본적으로 유니코드를 고려한 일치를 수행하지만, QRegularExpression 는 별도의 옵션이 필요합니다. 자세한 내용은 아래를 참조하십시오.
- QRegExp에서 c{.}는 기본적으로 줄바꿈 문자를 포함한 모든 문자와 일치합니다. 반면 QRegularExpression 는 기본적으로 줄바꿈 문자를 제외합니다. 줄바꿈 문자를 포함하려면 QRegularExpression::DotMatchesEverythingOption 패턴 옵션을 설정하십시오.
QRegularExpression 가 지원하는 정규 표현식 구문에 대한 개요는 PCRE(Perl 호환 정규 표현식의 참조 구현)에서 지원하는 패턴 구문을 설명하는 pcrepattern(3) 매뉴얼 페이지를 참조하십시오.
QRegExp::exactMatch()에서 이식하기
QRegExp::exactMatch()는 두 가지 용도로 사용되었습니다. 즉, 정규 표현식을 대상 문자열과 정확히 일치시키는 기능과 부분 일치 기능을 구현하는 것이었습니다.
QRegExp의 정확한 일치 기능에서 이식
정확 일치란 정규 표현식이 대상 문자열 전체와 일치하는지 여부를 나타냅니다. 예를 들어, 다음 클래스들은 대상 문자열 "abc123" 에 대해 다음과 같은 결과를 반환합니다:
| QRegExp::exactMatch() | QRegularExpressionMatch::hasMatch() | |
|---|---|---|
"\\d+" | false | true |
"[a-z]+\\d+" | true | true |
QRegularExpression 에서는 정확한 일치가 반영되지 않습니다. 대상 문자열이 정규 표현식과 정확히 일치하는지 확인하려면, QRegularExpression::anchoredPattern() 함수를 사용하여 패턴을 감싸면 됩니다:
QString p("a .*|pattern");
// re matches exactly the pattern string p
QRegularExpression re(QRegularExpression::anchoredPattern(p));QRegExp의 부분 일치에서 이식하기
QRegExp::exactMatch()를 사용할 때, 정확한 일치가 발견되지 않았더라도 QRegExp::matchedLength()를 호출하여 정규 표현식이 대상 문자열의 어느 정도까지 일치했는지 확인할 수 있습니다. 반환된 길이가 대상 문자열의 길이와 같다면, 부분 일치가 발견되었다고 판단할 수 있습니다.
QRegularExpression QRegularExpression::MatchType()를 통해 부분 일치를 명시적으로 지원합니다.
전역 일치
QRegExp API의 한계로 인해 전역 일치(즉, Perl에서와 같이)를 올바르게 구현하는 것은 불가능했습니다. 특히, 0개의 문자와 일치할 수 있는 패턴( "a*" 등)은 문제가 됩니다.
QRegularExpression::globalMatch()는 Perl의 전역 일치를 올바르게 구현하며, 반환된 이터레이터를 사용하여 각 결과를 검토할 수 있습니다.
예를 들어, 다음과 같은 코드가 있다고 가정해 보겠습니다:
QString subject("the quick fox");
int offset = 0;
QRegExp re("(\\w+)");
while ((offset = re.indexIn(subject, offset)) != -1) {
offset += re.matchedLength();
// ...
}다음과 같이 다시 작성할 수 있습니다:
QString subject("the quick fox");
QRegularExpression re("(\\w+)");
QRegularExpressionMatchIterator i = re.globalMatch(subject);
while (i.hasNext()) {
QRegularExpressionMatch match = i.next();
// ...
}유니코드 속성 지원
QRegExp를 사용할 때, \w, \d 등과 같은 문자 클래스는 해당 유니코드 속성을 가진 문자와 일치합니다. 예를 들어, \d 는 유니코드 속성 Nd (십진수 자릿수)를 가진 모든 문자와 일치합니다.
QRegularExpression 를 사용할 때, 이러한 문자 클래스는 기본적으로 ASCII 문자만 일치시킵니다. 예를 들어, \d 는 0-9 ASCII 범위 내의 문자와 정확히 일치합니다. QRegularExpression::UseUnicodePropertiesOption 패턴 옵션을 사용하면 이 동작을 변경할 수 있습니다.
와일드카드 일치
QRegularExpression 에서는 와일드카드 일치를 수행하는 직접적인 방법이 없습니다. 그러나 QRegularExpression::wildcardToRegularExpression() 메서드를 사용하면 glob 패턴을 해당 용도로 사용할 수 있는 Perl 호환 정규 표현식으로 변환할 수 있습니다.
예를 들어, 다음과 같은 코드가 있다고 가정해 보겠습니다:
다음과 같이 다시 작성할 수 있습니다:
auto wildcard = QRegularExpression(QRegularExpression::wildcardToRegularExpression("*.txt"));다만, 일부 셸 스타일의 와일드카드 패턴은 사용자가 기대하는 대로 변환되지 않을 수 있다는 점에 유의하시기 바랍니다. 다음 예제 코드는 앞서 언급한 함수를 사용하여 단순히 변환할 경우 아무런 오류 메시지 없이 작동하지 않게 됩니다:
const QString fp1("C:/Users/dummy/files/content.txt");
const QString fp2("/home/dummy/files/content.txt");
QRegExp re1("*/files/*");
re1.setPatternSyntax(QRegExp::Wildcard);
re1.exactMatch(fp1); // returns true
re1.exactMatch(fp2); // returns true
// but converted with QRegularExpression::wildcardToRegularExpression()
QRegularExpression re2(QRegularExpression::wildcardToRegularExpression("*/files/*"));
re2.match(fp1).hasMatch(); // returns false
re2.match(fp2).hasMatch(); // returns false이는 기본적으로 ` QRegularExpression::wildcardToRegularExpression()`가 반환하는 정규 표현식이 완전히 고정(anchored)되어 있기 때문입니다. 고정되지 않은 정규 표현식을 얻으려면 변환 옵션으로 ` QRegularExpression::UnanchoredWildcardConversion `를 전달하십시오:
QRegularExpression re3(QRegularExpression::wildcardToRegularExpression(
"*/files/*", QRegularExpression::UnanchoredWildcardConversion));
re3.match(fp1).hasMatch(); // returns true
re3.match(fp2).hasMatch(); // returns true최소 일치
QRegExp::setMinimal()는 양정자(QRegExp는 *?, +? 등과 같은 지연 양정자를 지원하지 않았음)의 탐욕성을 단순히 반전시켜 최소 일치를 구현했습니다. 반면 QRegularExpression 는 탐욕적, 지연 및 소유적 양정자를 모두 지원합니다. QRegularExpression::InvertedGreedinessOption 패턴 옵션은 QRegExp::setMinimal()의 효과를 모방하는 데 유용할 수 있습니다. 이 옵션이 활성화되면 양정자의 탐욕성을 반전시킵니다(탐욕적인 양정자는 비탐욕적으로, 비탐욕적인 양정자는 탐욕적으로 변경됩니다).
캐럿 모드
QRegularExpression::AnchorAtOffsetMatchOption 매칭 옵션을 사용하면 QRegExp::CaretAtOffset 동작을 모방할 수 있습니다. 다른 QRegExp::CaretMode 모드에 해당하는 기능은 없습니다.
QString, QStringList 및 QSortFilterProxyModel항목도 참조하십시오 .
멤버 유형 문서
enum QRegExp::CaretMode
CaretMode 열거형은 정규 표현식에서 캐럿(^)의 다양한 의미를 정의합니다. 가능한 값은 다음과 같습니다.
| 상수 | 값 | 설명 |
|---|---|---|
QRegExp::CaretAtZero | 0 | 캐럿은 검색 대상 문자열의 인덱스 0에 해당합니다. |
QRegExp::CaretAtOffset | 1 | 캐럿은 검색의 시작 오프셋을 나타냅니다. |
QRegExp::CaretWontMatch | 2 | 캐럿은 절대 일치하지 않습니다. |
enum QRegExp::PatternSyntax
패턴의 의미를 해석하는 데 사용되는 구문.
| 상수 | 값 | 설명 |
|---|---|---|
QRegExp::RegExp | 0 | Perl과 유사한 풍부한 패턴 매칭 구문입니다. 이것이 기본값입니다. |
QRegExp::RegExp2 | 3 | RegExp와 유사하지만, ` greedy quantifiers`가 적용됩니다. (Qt 4.2에서 도입됨.) |
QRegExp::Wildcard | 1 | 쉘(명령어 해석기)에서 “파일 글로빙”에 사용하는 것과 유사한 간단한 패턴 매칭 구문을 제공합니다. QRegExp wildcard matching 를 참조하십시오. |
QRegExp::WildcardUnix | 4 | 이는 Wildcard와 유사하지만 유닉스 셸의 동작 방식을 따릅니다. 와일드카드 문자는 "\" 문자로 이스케이프 처리할 수 있습니다. |
QRegExp::FixedString | 2 | 패턴은 고정된 문자열입니다. 이는 모든 메타문자가 escape()를 사용하여 이스케이프된 문자열에 RegExp 패턴을 적용하는 것과 동일합니다. |
QRegExp::W3CXmlSchema11 | 5 | 이 패턴은 W3C XML 스키마 1.1 사양에 정의된 정규 표현식입니다. |
setPatternSyntax()도 참조하십시오 .
멤버 함수 문서
QRegExp::QRegExp()
빈 정규식을 생성합니다.
isValid() 및 errorString()도 참조하십시오 .
[explicit] QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs = Qt::CaseSensitive, QRegExp::PatternSyntax syntax = RegExp)
주어진 pattern 문자열에 대한 정규식 객체를 생성합니다. syntax 가 Wildcard 인 경우 패턴은 와일드카드 표기법으로 지정해야 합니다; 기본값은 RegExp 입니다. cs 가 Qt::CaseInsensitive 인 경우를 제외하고, 패턴은 대소문자를 구분합니다. 일치 처리는 탐욕적(최대)이지만, setMinimal()를 호출하여 변경할 수 있습니다.
setPattern(), setCaseSensitivity(), setPatternSyntax()도 참조하십시오 .
QRegExp::QRegExp(const QRegExp &rx)
rx 의 복사본으로 정규식을 생성합니다.
operator=()도 참조하십시오 .
[noexcept] QRegExp::~QRegExp()
정규식을 삭제하고 내부 데이터를 정리합니다.
QString QRegExp::cap(int nth = 0) const
nth 하위 표현식에 의해 캡처된 텍스트를 반환합니다. 전체 일치 부분의 인덱스는 0이며, 괄호로 묶인 하위 표현식의 인덱스는 1부터 시작합니다(캡처하지 않는 괄호는 제외).
QRegExp rxlen("(\\d+)(?:\\s*)(cm|inch)");
int pos = rxlen.indexIn("Length: 189cm");
if (pos > -1) {
QString value = rxlen.cap(1); // "189"
QString unit = rxlen.cap(2); // "cm"
// ...
}cap()에 의해 일치된 요소의 순서는 다음과 같습니다. 첫 번째 요소인 cap(0)은 일치된 전체 문자열입니다. 그 이후의 각 요소는 다음 캡처용 왼쪽 괄호에 해당합니다. 따라서 cap(1)은 첫 번째 캡처용 왼쪽 괄호 안의 텍스트이고, cap(2)는 두 번째 캡처용 왼쪽 괄호 안의 텍스트이며, 이와 같이 이어집니다.
capturedTexts() 및 pos()도 참조하십시오 .
int QRegExp::captureCount() const
정규 표현식에 포함된 캡처의 개수를 반환합니다.
QStringList QRegExp::capturedTexts() const
캡처된 텍스트 문자열의 목록을 반환합니다.
목록의 첫 번째 문자열은 일치한 전체 문자열입니다. 그 이후의 각 목록 요소에는 정규식의 (캡처) 부분 표현식과 일치한 문자열이 포함됩니다.
예를 들어:
QRegExp rx("(\\d+)(\\s*)(cm|inch(es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", " ", "inches", "es")위의 예제에서는 존재할 수는 있지만 우리가 관심 없는 요소들도 캡처됩니다. 이 문제는 비캡처 괄호를 사용하여 해결할 수 있습니다:
QRegExp rx("(\\d+)(?:\\s*)(cm|inch(?:es)?)");
int pos = rx.indexIn("Length: 36 inches");
QStringList list = rx.capturedTexts();
// list is now ("36 inches", "36", "inches")목록을 반복 처리하려면 복사본을 대상으로 반복해야 한다는 점에 유의하십시오. 예를 들어:
QStringList list = rx.capturedTexts();
QStringList::iterator it = list.begin();
while (it != list.end()) {
myProcessing(*it);
++it;
}일부 정규 표현식은 불확정 횟수만큼 일치할 수 있습니다. 예를 들어, 입력 문자열이 "Offsets: 12 14 99 231 7"이고 정규 표현식 rx 가 (\d+)+인 경우, 일치한 모든 숫자의 목록을 얻기를 기대할 것입니다. 그러나 ` rx.indexIn(str)`을 호출한 후 `capturedTexts()`를 호출하면 목록("12", "12")이 반환됩니다. 즉, 전체 일치 결과는 "12"이며, 일치된 첫 번째 하위 표현식은 "12"입니다. 올바른 방법은 ` loop` 내에서 ` cap()`를 사용하는 것입니다.
문자열 목록 내 요소의 순서는 다음과 같습니다. 첫 번째 요소는 일치한 전체 문자열입니다. 그 이후의 각 요소는 다음 캡처 왼쪽 괄호에 해당합니다. 따라서 capturedTexts()[1]은 첫 번째 캡처 괄호의 텍스트이고, capturedTexts()[2]는 두 번째 캡처 괄호의 텍스트이며, 이와 같은 순서로 이어집니다(다른 정규식 언어의 $1, $2 등과 대응됨).
Qt::CaseSensitivity QRegExp::caseSensitivity() const
정규 표현식이 대소문자를 구분하여 일치하면 Qt::CaseSensitive 를 반환하고, 그렇지 않으면 Qt::CaseInsensitive 를 반환합니다.
setCaseSensitivity(), patternSyntax(), pattern() 및 isMinimal()도 참조하십시오 .
int QRegExp::countIn(const QString &str) const
str 에서 이 정규 표현식이 일치하는 횟수를 반환합니다.
indexIn(), lastIndexIn(), replaceIn()도 참조하십시오 .
QString QRegExp::errorString() const
정규식 패턴이 유효하지 않은 이유를 설명하는 텍스트 문자열을 반환합니다. 오류가 발생하지 않은 경우에는 "no error occurred"를 반환합니다.
isValid()도 참조하십시오 .
[static] QString QRegExp::escape(const QString &str)
모든 정규식 특수 문자에 백슬래시를 사용하여 이스케이프 처리한 문자열 “ str ”을 반환합니다. 특수 문자는 $, (,), *, +, ., ?, [, ,], ^, {, | 및 }입니다.
예시:
이 함수는 정규식 패턴을 동적으로 구성할 때 유용합니다:
setPatternSyntax()도 참조하십시오 .
bool QRegExp::exactMatch(const QString &str) const
이 정규 표현식이 ` str `와 정확히 일치하면 ` true `를 반환하고, 그렇지 않으면 ` false`를 반환합니다. ` matchedLength()`를 호출하여 문자열 중 얼마나 많은 부분이 일치했는지 확인할 수 있습니다.
주어진 정규식 문자열 R에 대해, exactMatch("R")은 indexIn("^R$")과 동일합니다. exactMatch()는 정규식을 문자열 시작 및 끝 앵커로 효과적으로 감싸기 때문이며, 유일한 차이점은 matchedLength()의 값을 다르게 설정한다는 점입니다.
matchedLength예를 들어, 정규 표현식이 blue인 경우, exactMatch()는 입력값이 blue 일 때만 true 을 반환합니다. 입력값이 bluebell, blutak 및 lightblue 인 경우, exactMatch()는 false 을 반환하고, ()는 각각 4, 3, 0을 반환합니다.
const로 선언되었지만, 이 함수는 matchedLength(), capturedTexts() 및 pos()을 설정합니다.
indexIn() 및 lastIndexIn()도 참조하십시오 .
QStringList QRegExp::filterList(const QStringList &stringList) const
stringList 에서 이 정규식과 일치하는 모든 문자열의 목록을 반환합니다.
int QRegExp::indexIn(const QStringList &list, int from) const
from 지점부터 앞으로 검색하여 list 내에서 이 정규 표현식과 정확히 일치하는 첫 번째 항목의 인덱스 위치를 반환합니다. 일치하는 항목이 없으면 -1을 반환합니다.
lastIndexIn() 및 exactMatch()도 참조하십시오 .
int QRegExp::indexIn(const QString &str, int offset = 0, QRegExp::CaretMode caretMode = CaretAtZero) const
str 에서 offset 위치(기본값은 0)부터 일치하는 부분을 찾으려고 시도합니다. offset 가 -1이면 마지막 문자로부터 검색을 시작하고, -2이면 마지막에서 두 번째 문자로부터 검색을 시작하는 식입니다.
첫 번째 일치 항목의 위치를 반환하며, 일치하는 항목이 없으면 -1을 반환합니다.
caretMode 매개변수를 사용하여 ^가 인덱스 0에서 일치할지, 아니면 offset 에서 일치할지 지정할 수 있습니다.
QString::indexOf(), QString::contains() 또는 QStringList::filter()을 사용하는 것이 더 적합할 수 있습니다. 일치하는 부분을 대체하려면 QString::replace()을 사용하십시오.
예시:
QString str = "offsets: 1.23 .50 71.00 6.00";
QRegExp rx("\\d*\\.\\d+"); // primitive floating point matching
int count = 0;
int pos = 0;
while ((pos = rx.indexIn(str, pos)) != -1) {
++count;
pos += rx.matchedLength();
}
// pos will be 9, 14, 18 and finally 24; count will end up as 4이 함수는 const로 선언되어 있지만, matchedLength(), capturedTexts() 및 pos()를 설정합니다.
QRegExp 가 와일드카드 표현식( setPatternSyntax() 참조)이고, 전체 와일드카드 표현식을 기준으로 문자열을 검사하려는 경우, 이 함수 대신 exactMatch()을 사용하십시오.
lastIndexIn() 및 exactMatch()도 참조하십시오 .
bool QRegExp::isEmpty() const
패턴 문자열이 비어 있으면 true 를 반환하고, 그렇지 않으면 false를 반환합니다.
빈 문자열에 대해 빈 패턴을 사용하여 ` exactMatch()`를 호출하면 `true`를 반환하며, 그렇지 않은 경우 전체 문자열을 대상으로 처리하므로 ` false `를 반환합니다. 어떤 문자열에 대해 빈 패턴을 사용하여 indexIn()를 호출하면, 빈 패턴이 문자열의 시작 부분에 있는 '빈 공간'과 일치하므로 시작 오프셋(기본값은 0)을 반환합니다. 이 경우 matchedLength()가 반환하는 일치 길이는 0이 됩니다.
QString::isEmpty()을 참조하십시오.
bool QRegExp::isMinimal() const
최소(비탐욕적) 매칭이 활성화되어 있으면 true 을 반환하고, 그렇지 않으면 false 을 반환합니다.
caseSensitivity() 및 setMinimal()도 참조하십시오 .
bool QRegExp::isValid() const
정규 표현식이 유효하면 ` true `을 반환하고, 그렇지 않으면 `false`를 반환합니다. 유효하지 않은 정규 표현식은 절대 일치하지 않습니다.
패턴 [a-z] 는 닫는 대괄호가 없기 때문에 유효하지 않은 패턴의 예입니다.
정규 표현식의 유효성은 와일드카드 플래그의 설정에 따라 달라질 수도 있습니다. 예를 들어, *.html은 유효한 와일드카드 정규 표현식이지만, 완전한 정규 표현식으로는 유효하지 않습니다.
errorString()도 참조하십시오 .
int QRegExp::lastIndexIn(const QStringList &list, int from) const
list from 에서 이 정규 표현식과 정확히 일치하는 마지막 항목의 인덱스 위치를, 인덱스 위치 부터 역방향으로 검색하여 반환합니다. 가 -1(기본값)인 경우, 검색은 마지막 항목에서 시작됩니다. 일치하는 항목이 없으면 -1을 반환합니다. from
QRegExp::exactMatch()도 참조하십시오 .
int QRegExp::lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const
` str `에서 ` offset` 위치부터 역방향으로 일치하는 부분을 찾으려고 시도합니다. ` offset `가 -1(기본값)인 경우 검색은 마지막 문자로부터 시작하고, -2인 경우 마지막에서 두 번째 문자로부터 시작하며, 이와 같은 방식으로 진행됩니다.
첫 번째 일치 위치의 인덱스를 반환하며, 일치하는 부분이 없으면 -1을 반환합니다.
caretMode 매개변수를 사용하여 ^가 인덱스 0에서 일치할지, 아니면 offset 에서 일치할지 지정할 수 있습니다.
const 함수이지만, 이 함수는 matchedLength(), capturedTexts() 및 pos()을 설정합니다.
경고: 역방향검색은 순방향 검색보다 훨씬 느립니다.
indexIn() 및 exactMatch()도 참조하십시오 .
int QRegExp::matchedLength() const
마지막으로 일치한 문자열의 길이를 반환하며, 일치하는 항목이 없으면 -1을 반환합니다.
exactMatch(), indexIn(), lastIndexIn()도 참조하십시오 .
QString QRegExp::pattern() const
정규 표현식의 패턴 문자열을 반환합니다. 패턴은 patternSyntax()에 따라 정규 표현식 구문 또는 와일드카드 구문 중 하나를 사용합니다.
setPattern(), patternSyntax() 및 caseSensitivity()도 참조하십시오 .
QRegExp::PatternSyntax QRegExp::patternSyntax() const
정규 표현식에서 사용된 구문을 반환합니다. 기본값은 QRegExp::RegExp 입니다.
setPatternSyntax(), pattern() 및 caseSensitivity()도 참조하십시오 .
int QRegExp::pos(int nth = 0) const
nth 로 캡처된 텍스트가 검색된 문자열 내에서 차지하는 위치를 반환합니다. nth 가 0(기본값)인 경우, pos()는 전체 일치 부분의 위치를 반환합니다.
예시:
QRegExp rx("/([a-z]+)/([a-z]+)");
rx.indexIn("Output /dev/null"); // returns 7 (position of /dev/null)
rx.pos(0); // returns 7 (position of /dev/null)
rx.pos(1); // returns 8 (position of dev)
rx.pos(2); // returns 12 (position of null)길이가 0인 일치에 대해서는 pos()가 항상 -1을 반환합니다. (예를 들어, cap(4)가 빈 문자열을 반환한다면, pos(4)는 -1을 반환합니다.) 이는 구현상의 특징입니다.
cap() 및 capturedTexts()도 참조하십시오 .
QString QRegExp::removeIn(const QString &str) const
이 정규식 str 이 나타나는 모든 부분을 제거하고 결과를 반환합니다.
replaceIn(str, QString())과 동일한 기능을 수행합니다.
indexIn(), lastIndexIn(), replaceIn()도 참조하십시오 .
QString QRegExp::replaceIn(const QString &str, const QString &after) const
str 에서 이 정규 표현식이 나타나는 모든 부분을 after 로 바꾸고 그 결과를 반환합니다.
capturing parentheses 를 포함하는 정규 표현식에서, \1, \2, ...와 같은 표현이 after 내에서 rx 로 대체됩니다. cap(1), cap(2), ...
indexIn(), lastIndexIn() 및 QRegExp::cap()도 참조하십시오 .
QStringList QRegExp::replaceIn(const QStringList &stringList, const QString &after) const
stringList 의 각 요소에서 이 정규 표현식이 일치하는 모든 부분을 after 로 대체합니다. 문자열 목록에 대한 참조를 반환합니다.
void QRegExp::setCaseSensitivity(Qt::CaseSensitivity cs)
대소문자를 구분하는 일치 방식을 ` cs`로 설정합니다.
cs 가 Qt::CaseSensitive 인 경우, \.txt$는 readme.txt 와는 일치하지만 README.TXT 와는 일치하지 않습니다.
caseSensitivity(), setPatternSyntax(), setPattern(), setMinimal()도 참조하십시오 .
void QRegExp::setMinimal(bool minimal)
최소 일치 기능을 활성화하거나 비활성화합니다. ` minimal `가 `false`인 경우, 일치는 탐욕적(최대) 방식으로 이루어지며, 이는 기본 설정입니다.
예를 들어, 입력 문자열이 "We must be <b>bold</b>, very <b>bold</b>!"이고 패턴이 <b>.*</b>라고 가정해 봅시다. 기본값인 탐욕적(최대) 매칭을 적용하면, 매칭 결과는 "We must be <b>bold</b>, very <b>bold</b>!"가 됩니다. 그러나 최소(비탐욕적) 매칭을 사용하면, 첫 번째 매칭 결과는 "We must be <b>bold</b>, very <b>bold</b>!"이고, 두 번째 매칭 결과는 "We must be <b>bold</b>, very <b>bold</b>!"입니다. 실제 상황에서는 대신 <b>[^<]*</b> 패턴을 사용할 수도 있지만, 이 경우에도 중첩된 태그에서는 일치에 실패합니다.
isMinimal() 및 setCaseSensitivity()도 참조하십시오 .
void QRegExp::setPattern(const QString &pattern)
패턴 문자열을 pattern 로 설정합니다. 대소문자 구분, 와일드카드 및 최소 일치 옵션은 변경되지 않습니다.
pattern(), setPatternSyntax() 및 setCaseSensitivity()도 참조하십시오 .
void QRegExp::setPatternSyntax(QRegExp::PatternSyntax syntax)
정규 표현식의 구문 모드를 설정합니다. 기본값은 QRegExp::RegExp 입니다.
syntax 를 QRegExp::Wildcard 로 설정하면 쉘과 유사한 단순 패턴( QRegExp wildcard matching)이 활성화됩니다. 예를 들어, r*.txt는 와일드카드 모드에서 readme.txt 문자열과 일치하지만, readme 와는 일치하지 않습니다.
syntax 를 QRegExp::FixedString 로 설정하면 패턴이 일반 문자열로 해석됩니다. 이 경우 특수 문자(예: 백슬래시)를 이스케이프 처리할 필요가 없습니다.
patternSyntax(), setPattern(), setCaseSensitivity(), escape()도 참조하십시오 .
QStringList QRegExp::splitString(const QString &str, Qt::SplitBehavior behavior = Qt::KeepEmptyParts) const
str 을 이 정규 표현식이 일치하는 모든 위치에서 부분 문자열로 분할하고, 해당 문자열들의 목록을 반환합니다. 이 정규 표현식이 문자열 내에서 어디에도 일치하지 않는 경우, split()은 str 을 포함하는 단일 요소 목록을 반환합니다.
behavior 가 Qt::KeepEmptyParts 로 설정된 경우, 빈 필드도 결과 리스트에 포함됩니다.
QStringList::join() 및 QString::split()도 참조하십시오 .
[noexcept] void QRegExp::swap(QRegExp &other)
other 정규 표현식을 이 정규 표현식으로 바꿉니다. 이 작업은 매우 빠르며 절대 실패하지 않습니다.
QRegExp::operator QVariant() const
정규식을 다음과 같은 형식으로 반환합니다. QVariant
bool QRegExp::operator!=(const QRegExp &rx) const
이 정규 표현식이 rx 과 일치하지 않으면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.
operator==()도 참조하십시오 .
[noexcept] QRegExp &QRegExp::operator=(QRegExp &&other)
other 를 이 QRegExp 인스턴스에 할당합니다.
QRegExp &QRegExp::operator=(const QRegExp &rx)
정규 표현식 ` rx `을 복사하고, 복사본에 대한 참조를 반환합니다. 대소문자 구분, 와일드카드 및 최소 일치 옵션도 함께 복사됩니다.
bool QRegExp::operator==(const QRegExp &rx) const
이 정규 표현식이 rx 과 같으면 true 를 반환하고, 그렇지 않으면 false 를 반환합니다.
두 QRegExp 객체는 패턴 문자열과 대소문자 구분, 와일드카드 및 최소 일치에 대한 설정이 동일할 때 동일합니다.
관련 비회원
[noexcept] size_t qHash(const QRegExp &key, size_t seed = 0)
seed 를 계산의 시드로 사용하여 key 에 대한 해시 값을 반환합니다.
QDataStream &operator<<(QDataStream &out, const QRegExp ®Exp)
정규 표현식 regExp 을 스트림 out 에 기록합니다.
'Qt 데이터 유형 직렬화'항목도 참조하십시오 .
QDataStream &operator>>(QDataStream &in, QRegExp ®Exp)
in 스트림에서 정규식을 읽어 regExp 에 저장합니다.
Qt 데이터 유형 직렬화항목도 참조하십시오 .
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.