QRegExp Class
QRegExp 클래스는 정규식을 사용하여 패턴 매칭을 제공합니다. 더 보기...
Header: | #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) |
QVariant | 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 로 이전 코드를 포팅하는 방법에 대한 지침은 { QRegularExpression 로 포팅하기 }를 참조하세요.
정규식 또는 "정규식"은 텍스트의 하위 문자열을 일치시키기 위한 패턴입니다. 이는 다음과 같은 여러 상황에서 유용합니다,
유효성 검사 | 정규식은 하위 문자열이 정수인지, 공백이 없는지 등 일부 기준을 충족하는지 여부를 테스트할 수 있습니다. |
검색 | 정규식은 단순한 부분 문자열 일치보다 더 강력한 패턴 일치를 제공합니다(예: 메일, 편지, 서신 중 하나만 일치하고 이메일, 우편배달부, 우편함, 레터박스 등의 단어는 일치하지 않는 경우). |
검색 및 바꾸기 | 정규식은 하위 문자열의 모든 항목을 다른 하위 문자열로 대체할 수 있습니다(예: &의 모든 항목을 &로 대체, & 뒤에 이미 앰프를 붙인 경우 제외). |
문자열 분할 | 정규식은 탭으로 구분된 문자열을 분할하는 등 문자열을 분리해야 하는 위치를 식별하는 데 사용할 수 있습니다. |
정규식에 대한 간략한 소개, Qt의 정규식 언어에 대한 설명, 몇 가지 예제 및 함수 설명서가 제공됩니다. QRegExp는 Perl의 정규식 언어를 모델로 합니다. 유니코드를 완벽하게 지원합니다. QRegExp는 명령 셸에서 볼 수 있는 기능과 유사한 더 간단한 와일드카드 모드로도 사용할 수 있습니다. QRegExp에서 사용하는 구문 규칙은 setPatternSyntax()로 변경할 수 있습니다. 특히 패턴 구문을 QRegExp::FixedString 으로 설정할 수 있는데, 이는 일치시킬 패턴이 일반 문자열로 해석되어 특수 문자(예: 백슬래시)가 이스케이프되지 않음을 의미합니다.
정규식에 대한 좋은 텍스트는 정규식 마스터하기 (제3판)(Jeffrey E. F. Friedl 저, ISBN 0-596-52812-4)를 참고하세요.
참고: Qt 5에서는 새로운 QRegularExpression 클래스가 정규 표현식의 Perl 호환 구현을 제공하며 QRegExp 대신 사용할 것을 권장합니다.
소개
정규식은 표현식, 수량화자 및 어설션으로 구성됩니다. 가장 간단한 표현식은 x 또는 5와 같은 문자입니다. 표현식은 대괄호로 묶인 문자의 집합일 수도 있습니다. [ ABCD] 는 A 또는 B, C 또는 D와 일치하는 표현식을 [A-D]로 쓸 수 있으며, 영어 알파벳의 모든 대문자를 일치시키는 표현식은 [A-Z]로 쓸 수 있습니다.
x{1,1}은 하나의 x만 일치시키고, x{1,5}는 최소 1개에서 최대 5개까지 포함된 일련의 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 또는 한 자리 더, 바로 뒤에 문자열의 끝을 의미합니다.
'메일' , '편지' , '서신' 중 하나에 일치하지만 이러한 단어가 포함된 단어(예: '이메일', '메일맨', '메일러', '레터박스')와는 일치하지 않는 정규식을 작성하려면 '메일'과 일치하는 정규식으로 시작하세요. 정규식으로 표현하면 정규식은 m{1,1}a{1,1}i{1,1}l{1,1}이지만 문자 표현식은 {1,1}로 자동 수량화되므로 정규식을 메일로 단순화하면 'm' 뒤에 'a', 'i' 뒤에 'l'이 오는 식으로 표현할 수 있습니다. 이제 다른 두 단어를 포함하기 위해 또는를 의미하는 세로 막대 |를 사용할 수 있으므로 세 단어 중 하나를 일치시키는 정규식은 mail|letter|correspondence가 됩니다. '메일' 또는 '편지' 또는 '서신'을 일치시킵니다. 이 정규식은 일치시키려는 세 단어 중 하나를 일치시키지만, 일치시키지 않으려는 단어(예: '이메일')도 일치시킵니다. 정규식이 원치 않는 단어와 일치하지 않도록 하려면 단어 경계에서 일치를 시작하고 끝내도록 지시해야 합니다. 먼저 정규식을 괄호로 묶습니다 (메일|편지|통신). 괄호는 표현식을 함께 그룹화하여 capture. 표현식을 괄호로 묶으면 더 복잡한 정규식의 구성 요소로 사용할 수 있습니다. 또한 세 단어 중 어떤 단어가 실제로 일치했는지 검사할 수 있습니다. 단어 경계에서 일치를 시작하고 끝내도록 하려면 정규식을 \b 단어 경계 어설션으로 묶습니다: \ b(메일|편지|서신)\b. 이제 정규식은 다음을 의미합니다: 단어 경계를 일치시킨 다음 괄호 안에 정규식을 넣고 그 뒤에 단어 경계를 일치시킵니다. b 어설션은 문자가 아니라 정규식의 위치와 일치합니다. 단어 경계는 공백, 개행, 문자열의 시작 또는 끝과 같이 단어가 아닌 모든 문자를 말합니다.
앰퍼샌드 문자를 HTML 엔티티 & 로 바꾸려면 일치시킬 정규식은 간단히 &입니다. 그러나 이 정규식은 이미 HTML 엔티티로 변환된 앰퍼샌드도 일치시킵니다. 앰퍼샌드 뒤에 앰; 가 오지 않은 앰퍼샌드만 바꾸고 싶습니다. 이를 위해서는 네거티브 룩헤드 어설션 (?!__)이 필요합니다. 그러면 정규식은 &(?!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'와 일치합니다. |
사전 정의된 문자 집합 약어를 사용하면 여러 플랫폼과 언어에서 문자 범위를 사용하는 것보다 이식성이 뛰어납니다. 예를 들어, [0-9 ]는 서양 알파벳의 숫자와 일치하지만 \d는 모든 알파벳의 숫자와 일치합니다.
참고: 다른 정규식 문서에서는 문자 집합을 종종 "문자 클래스"라고 부릅니다.
수량화자
기본적으로 표현식은 {1,1}로 자동 수량화됩니다. 즉, 정확히 한 번만 나타나야 합니다. 다음 목록에서 E는 표현식을 나타냅니다. 표현식은 문자 또는 문자 집합의 약어, 대괄호 안의 문자 집합 또는 괄호 안의 표현식입니다.
E? | 이 한정자는 표현식이 있는지 여부와 일치하기 때문에 앞의 표현식은 선택 사항입니다. 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} | 정확히 n번의 E를 일치시킵니다. E{n}은 E를 n번 반복하는 것과 같습니다. 예를 들어, x{5}는 xxxxx와 동일합니다. 또한, x{5,5}와 같이 E{n,n}과도 동일합니다. |
E{n,} | 최소 n번의 E와 일치합니다. |
E{,m} | E{,m}은 E{0,m}과 동일합니다. |
E{n,m} | E의 최소 n개에서 최대 m개까지 일치합니다. |
앞의 문자뿐만 아니라 여러 문자에 한정자를 적용하려면 괄호를 사용해 표현식에서 문자를 그룹화하세요. 예를 들어, 태그+는 't' 다음에 'a' 다음에 하나 이상의 'g'와 일치하는 반면, (태그)+는 '태그'가 하나 이상 포함된 경우와 일치합니다.
참고: 한정자는 일반적으로 "욕심"이 많습니다. 항상 가능한 한 많은 텍스트와 일치시킵니다. 예를 들어, 0+는 처음 찾은 0과 첫 번째 0 이후의 연속된 모든 0과 일치합니다. '20005'에 적용하면 '20005'와 일치합니다. 한정자는 비탐욕적으로 만들 수 있습니다( setMinimal() 참조).
텍스트 캡처
괄호를 사용하면 요소를 그룹화하여 정량화하고 캡처할 수 있습니다. 예를 들어 메일|편지|서신이라는 표현식이 문자열과 일치하는 경우 단어 중 하나가 일치한다는 것은 알지만 어떤 단어가 일치하는지는 알 수 없습니다. 괄호를 사용하면 그 범위 내에서 일치하는 모든 것을 '캡처'할 수 있으므로, (mail|letter|correspondence) 를 사용하여 이 정규식을 "내가 이메일을 보냈습니다"라는 문자열과 일치시킨 경우 cap() 또는 capturedTexts() 함수를 사용하여 일치하는 문자(이 경우 'mail')를 추출할 수 있습니다.
정규식 자체 내에서 캡처한 텍스트를 사용할 수 있습니다. 캡처된 텍스트를 참조하기 위해 cap()와 동일하게 1부터 인덱싱되는 역참조를 사용합니다. 예를 들어 \b(\w+)\W+\1\b를 사용하여 문자열에서 단어 경계와 하나 이상의 단어 문자, 단어가 아닌 문자 하나 이상, 첫 번째 괄호로 묶인 표현식과 단어 경계가 같은 텍스트를 일치시키는 방식으로 중복된 단어를 검색할 수 있습니다.
괄호를 캡처 용도가 아닌 그룹화 용도로만 사용하려면 비캡처 구문(예: (?:녹색|파란색)을 사용하면 됩니다. 캡처하지 않는 괄호는 '(?:'로 시작하고 ')'로 끝납니다. 이 예에서는 '녹색' 또는 '파란색' 중 하나를 일치시키지만 일치 항목을 캡처하지 않으므로 일치 여부만 알 수 있고 실제로 어떤 색상을 찾았는지는 알 수 없습니다. 캡처하지 않는 괄호를 사용하는 것이 캡처하는 괄호를 사용하는 것보다 정규식 엔진이 장부 정리를 덜 해야 하므로 더 효율적입니다.
캡처 괄호와 캡처하지 않는 괄호는 모두 중첩될 수 있습니다.
역사적인 이유로 괄호 안에 괄호를 캡처하는 데 적용되는 수량화자(예: *)는 다른 수량화자보다 '욕심'이 더 큽니다. 예를 들어 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"]
Assertions
어설션은 정규 표현식에서 해당 문자가 나오는 지점에서 텍스트에 대해 어떤 진술을 하지만 어떤 문자와도 일치하지 않습니다. 다음 목록에서 E는 모든 표현식을 나타냅니다.
^ | 캐럿은 문자열의 시작 부분을 나타냅니다. 리터럴 ^ 을 일치시키려면 \\^ 을 작성하여 이스케이프 처리해야 합니다. 예를 들어 ^#include는 '#include' 문자로 시작하는 문자열만 일치시킵니다. 캐럿이 문자 집합의 첫 번째 문자인 경우 특별한 의미가 있습니다( Sets of Characters 참조). |
$ | 달러는 문자열의 끝을 나타냅니다. 예를 들어 \d\s*$는 선택적으로 공백이 뒤에 오는 숫자로 끝나는 문자열과 일치합니다. 리터럴 $ 을 일치시키려면 \\$ 을 작성하여 이스케이프 처리해야 합니다. |
\b | 단어 경계. 예를 들어 정규식 \bOK\b는 단어 경계(예: 문자열의 시작 또는 공백) 바로 뒤에 있는 문자 'O'와 다른 단어 경계(예: 문자열의 끝 또는 공백) 바로 앞에 있는 문자 'K'를 일치시키는 것을 의미합니다. 그러나 어설션은 실제로 공백과 일치하지 않으므로 (\bOK\b)를 작성하고 일치하는 항목이 있는 경우 문자열이 "이제 괜찮습니다 "인 경우에도 'OK'만 포함됩니다. |
\B | 단어가 아닌 경계. 이 어설션은 \b가 거짓일 때마다 참입니다. 예를 들어 "Left on"에서 \Bon\B를 검색하면 일치하지 않지만(공백과 문자열의 끝은 단어가 아닌 경계가 아님), "tonne"에서는 일치합니다. |
(?=E) | 포지티브 룩헤드. 이 어설션은 정규식의 이 지점에서 표현식이 일치하면 참입니다. 예를 들어, const(?=\s+char) 는 'static const char *'에서처럼 'const' 뒤에 'char'가 올 때마다 'const'와 일치합니다. ('static const char *'와 일치하는 const\s+char와 비교하세요.) |
(?!E) | 네거티브 룩헤드. 이 어설션은 정규식의 이 지점에서 표현식이 일치하지 않으면 참입니다. 예를 들어, const(?!\s+char) 는 뒤에 'char'가 오는 경우를 제외하고 'const'와 일치합니다. |
와일드카드 일치
bash 또는 cmd.exe와 같은 대부분의 명령 셸은 와일드카드를 사용하여 파일 그룹을 식별하는 기능인 "파일 글로빙"을 지원합니다. setPatternSyntax () 함수는 정규식과 와일드카드 모드 사이를 전환하는 데 사용됩니다. 와일드카드 매칭은 전체 정규식보다 훨씬 간단하며 네 가지 기능만 있습니다:
c | 아래에 언급된 문자를 제외한 모든 문자가 자신을 나타냅니다. 따라서 c는 문자 c와 일치합니다. |
? | 단일 문자와 일치합니다. 전체 정규 표현식에서 와 동일합니다. |
* | 0개 이상의 문자와 일치합니다. 전체 정규식의 .*와 동일합니다. |
[...] | 문자 집합은 전체 정규식과 유사하게 대괄호로 표현할 수 있습니다. 외부와 마찬가지로 문자 클래스 내에서 백슬래시는 특별한 의미가 없습니다. |
와일드카드 모드에서는 와일드카드 문자를 이스케이프 처리할 수 없습니다. 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 false
Perl 사용자를 위한 참고 사항
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 정규식은 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폭 양수 및 0폭 음수 룩백 어설션(?!=패턴) 및 (?!패턴)은 Perl과 동일한 구문으로 모두 지원됩니다. Perl의 룩비하인드 어설션, "독립적인" 하위 표현식 및 조건식은 지원되지 않습니다.
캡처되지 않는 괄호도 동일한 (?:패턴) 구문으로 지원됩니다.
Perl의 분할 및 조인 함수에 해당하는 함수는 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'(공백 없음)와 앵커를 사용했습니다.
다음 예에서는 '메일', '편지' 또는 '서신'이 포함된 문자열을 일치시키지만 '이메일'이 아닌 전체 단어만 일치시킵니다.
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
두 번째 문자열은 " 편지를 써주세요"와 일치합니다. '편지'라는 단어도 괄호로 인해 캡처됩니다. 이렇게 캡처한 텍스트를 확인할 수 있습니다:
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이 되어 '한 에릭 또 다른 에릭, 그리고 에릭슨'과 일치합니다. '는 ' 에릭슨' 또는 '에릭슨'과 일치하지 않는데, 이는 단어가 아닌 경계에 묶이지 않기 때문입니다.
정규식의 일반적인 용도 중 하나는 구분된 데이터의 줄을 구성 요소 필드로 분할하는 것입니다.
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 는 별도의 옵션이 필요합니다. 자세한 내용은 아래를 참조하세요.
- 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(); // ... }
유니코드 속성 지원
예를 들어, \w
, \d
등과 같은 문자 클래스는 문자를 해당 유니코드 속성과 일치시킵니다(예: \d
는 유니코드 Nd
(10자리 숫자) 속성을 가진 모든 문자와 일치합니다).
이러한 문자 클래스는 QRegularExpression 사용 시 기본적으로 ASCII 문자만 일치시킵니다(예: \d
은 0-9
ASCII 범위의 문자와 정확히 일치). QRegularExpression::UseUnicodePropertiesOption 패턴 옵션을 사용하여 이 동작을 변경할 수 있습니다.
와일드카드 일치
QRegularExpression 에서 와일드카드 일치를 수행하는 직접적인 방법은 없지만, QRegularExpression::wildcardToRegularExpression() 메서드는 글로브 패턴을 해당 용도로 사용할 수 있는 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()가 반환하는 정규식이 완전히 고정되어 있기 때문입니다. 앵커링되지 않은 정규식을 얻으려면 변환 옵션으로 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
캐럿모드 열거형은 정규식에서 캐럿(^)의 다양한 의미를 정의합니다. 가능한 값은 다음과 같습니다:
Constant | 값 | 설명 |
---|---|---|
QRegExp::CaretAtZero | 0 | 캐럿은 검색된 문자열에서 인덱스 0에 해당합니다. |
QRegExp::CaretAtOffset | 1 | 캐럿은 검색의 시작 오프셋에 해당합니다. |
QRegExp::CaretWontMatch | 2 | 캐럿은 절대 일치하지 않습니다. |
enum QRegExp::PatternSyntax
패턴의 의미를 해석하는 데 사용되는 구문입니다.
Constant | 값 | 설명 |
---|---|---|
QRegExp::RegExp | 0 | Perl과 유사한 풍부한 패턴 일치 구문입니다. 이것이 기본값입니다. |
QRegExp::RegExp2 | 3 | RegExp와 비슷하지만 greedy quantifiers. (Qt 4.2에 도입되었습니다.) |
QRegExp::Wildcard | 1 | 이것은 셸(명령 인터프리터)이 "파일 글로빙"에 사용하는 것과 유사한 간단한 패턴 일치 구문을 제공합니다. QRegExp wildcard matching 을 참조하십시오. |
QRegExp::WildcardUnix | 4 | 와일드카드와 유사하지만 유닉스 셸의 동작이 있습니다. 와일드카드 문자는 "\" 문자로 이스케이프 처리할 수 있습니다. |
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; }
일부 정규식은 불특정 횟수와 일치할 수 있습니다. 예를 들어 입력 문자열이 "오프셋: 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
정규식 패턴이 대소문자가 잘못된 이유를 설명하는 텍스트 문자열을 반환하고, 그렇지 않으면 "오류 발생 없음"을 반환합니다.
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$")와 동일하지만, matchedLength()를 다르게 설정한다는 점을 제외하면 정확한 일치()는 문자열 시작과 끝 앵커에서 정규식을 효과적으로 둘러싸기 때문에 ("^R$")와 동일합니다.
예를 들어 정규식이 파란색인 경우 exactMatch()는 blue
입력에 대해서만 true
를 반환합니다. bluebell
, blutak
및 lightblue
입력의 경우 exactMatch()는 false
및 matchedLength()는 각각 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
offset 위치(기본값은 0)에서 str 에서 일치하는 항목을 찾으려고 시도합니다. 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()를 호출하면 참을 반환하고, 그렇지 않으면 전체 문자열에 대해 작동하므로 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 에서 거꾸로 검색합니다. from 이 -1(기본값)이면 마지막 항목부터 검색이 시작됩니다. 일치하는 항목이 없으면 -1을 반환합니다.
QRegExp::exactMatch()도 참조하세요 .
int QRegExp::lastIndexIn(const QString &str, int offset = -1, QRegExp::CaretMode caretMode = CaretAtZero) const
offset 위치에서 str 에서 거꾸로 일치하는 항목을 찾으려고 시도합니다. 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 를 포함하는 정규식의 경우 after 에서 \1, \2, ...의 발생은 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 이 거짓이면 기본값인 욕심껏(최대) 일치합니다.
예를 들어 입력 문자열 "우리는 매우 <b>볼드해야 합니다!"와 패턴 <b>.*</b>가 있다고 가정해 보겠습니다. 기본 욕심(최대) 매칭을 사용하면 "우리는 <b>붉은 색이어야 합니다, 매우 <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 을 이 정규식으로 바꿉니다. 이 작업은 매우 빠르며 실패하지 않습니다.
QVariant 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 데이터 유형 직렬화도참조하십시오 .
© 2025 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.