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 的正则表达式语言为蓝本。它完全支持 Unicode。QRegExp 还可以以一种更简单的通配符模式使用,该模式类似于命令行 shell 中的功能。 QRegExp 使用的语法规则可通过 `setPatternSyntax()` 进行修改。特别是,模式语法可以设置为 `QRegExp::FixedString`,这意味着待匹配的模式将被解释为普通字符串,即特殊字符(如反斜杠)不会被转义。
关于正则表达式的一本优秀著作是杰弗里·E·F·弗里德尔(Jeffrey E. F. Friedl)所著的《精通正则表达式》(第三版),ISBN 0-596-52812-4。
注意:在 Qt 5 中,新的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但不超过五个。
请注意,通常正则表达式无法用于检查括号或标签是否平衡。 例如,可以编写一个正则表达式来匹配 HTML 的起始标签<b> 及其结束标签</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单词边界断言中:\b(mail|letter|correspondence)\b 。现在,该正则表达式的含义是:匹配一个单词边界,后跟括号中的正则表达式,再后跟一个单词边界。 \b 断言匹配的是正则表达式中的位置,而非单个字符。单词边界是指任何非单词字符,例如空格、换行符,或是字符串的开头或结尾。
如果我们要将“&”字符替换为 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,Unix 换行符)。 |
| \r | 匹配 ASCII 回车符 (CR,0x0D)。 |
| \t | 匹配 ASCII 水平制表符 (HT,0x09)。 |
| \v | 匹配 ASCII 垂直制表符(VT,0x0B)。 |
| \xhhhh | 匹配与十六进制数hhhh(介于 0x0000 到 0xFFFF 之间)相对应的 Unicode 字符。 |
| \0ooo(即\zero ooo) | 匹配八进制数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},即它应出现 exactly once。在下面的列表中,E代表表达式。表达式可以是一个字符、一组字符的缩写、方括号中的字符集,或者括号中的表达式。
| E? | 匹配零次或一次出现E。该量词表示“前面的表达式是可选的”,因为无论是否找到该表达式,它都会匹配。E?与E{0,1} 相同。例如,dents?匹配 'dent' 或 'dents'。 |
| E+ | 匹配E 出现一次或多次。E+与E{1,} 相同。例如,0+匹配 '0'、'00'、'000' 等。 |
| E* | 匹配零个或多个E 的出现。它等同于E{0,}。*量词常被错误地用于本应使用+的场合。 例如,如果在表达式中使用\s*$来匹配以空格结尾的字符串,它将匹配所有字符串,因为\s*$ 意味着“匹配零个或多个空格,后跟字符串结尾”。要匹配至少包含一个尾随空格字符的字符串,正确的正则表达式应为\s+$。 |
| E{n} | 匹配E 出现n 次。E{n}相当于将E重复n次。例如,x{5}与xxxxx 相同。它也等同于E{n,n},例如x{5,5}。 |
| E{n,} | 匹配E 出现至少n次。 |
| E{,m} | 匹配至多m次E。E{,m}与E{0,m} 相同。 |
| E{n,m} | 匹配至少n次且至多m次E。 |
若要将量词应用于前一个字符之外的其他字符,请使用圆括号将字符分组到表达式中。例如,tag+匹配一个 't' 后面跟一个 'a',再后面跟至少一个 'g';而(tag)+则匹配至少一个 'tag'。
注意:量词通常是“贪婪”的。它们总是匹配尽可能多的文本。例如,0+匹配它找到的第一个零以及该零之后的所有连续零。应用于 '20005' 时,它匹配'20005'。 量词可以设置为非贪婪模式,详见setMinimal()。
捕获文本
圆括号允许我们将元素分组,以便对其进行量化或捕获。例如,如果我们有一个表达式mail|letter|correspondence匹配某个字符串,那么我们知道其中一个单词被匹配到了,但不知道具体是哪一个。 使用圆括号可以让我们“捕获”其范围内匹配到的内容,因此如果我们使用(mail|letter|correspondence),并将该正则表达式与字符串“I sent you some email”进行匹配,就可以使用cap() 或capturedTexts() 函数来提取匹配到的字符,在本例中即为 'mail'。
我们可以在正则表达式内部使用捕获的文本。要引用捕获的文本,我们使用反向引用,其索引从1开始,这与cap()中的索引方式相同。 例如,我们可以使用\b(\w+)\W+\1\b 来搜索字符串中的重复单词,这意味着匹配一个单词边界,后跟一个或多个单词字符,再后跟一个或多个非单词字符,接着是与第一个括号表达式相同的文本,最后以一个单词边界结束。
如果我们希望仅将圆括号用于分组而非捕获,可以使用非捕获语法,例如(?:green|blue)。非捕获圆括号以 '(?:' 开头,以 ')' 结尾。 在此示例中,我们匹配“green”或“blue”中的任意一个,但不会捕获匹配结果,因此我们仅能知道是否匹配成功,而无法得知实际匹配到的颜色。使用非捕获括号比使用捕获括号更高效,因为正则表达式引擎需要处理的记录工作更少。
捕获括号和非捕获括号均可嵌套。
出于历史原因,应用于捕获括号的量词(例如*)比其他量词更“贪婪”。 例如,a*(a*)将匹配“aaa”,此时 cap(1) == “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),且匹配成功,则匹配结果仅包含“OK”,即使字符串是“It'sOKnow”。 |
| \B | 非单词边界。只要 \b 处为假。例如,如果我们在 \Bon\B 在“Left on”中,匹配会失败(空格和字符串结尾不属于非单词边界),但在“tonne”中则会匹配。 |
| (?=E) | 正向看前。如果正则表达式在此处匹配,则该断言为真。例如,const(?=\s+char)会在 'const' 后紧跟 'char' 时匹配 'const',如 'staticconstchar *' 所示。(可与const\s+char 对比,后者匹配 'staticconst char*'。) |
| (?!E) | 负向前看。如果正则表达式在此处不匹配该表达式,则该断言为真。例如,const(?!\s+char)匹配 'const',但当其后紧跟 'char'时除外。 |
通配符匹配
大多数命令行 shell(如bash或cmd.exe)都支持“文件通配符”,即使用通配符来识别一组文件的功能。setPatternSyntax() 函数用于在正则表达式模式和通配符模式之间切换。通配符匹配比完整的正则表达式简单得多,仅具有以下四项特性:
| c | 除下文提及的情况外,任何字符均代表其本身。因此,c匹配字符c。 |
| ? | 匹配任意单个字符。其作用等同于完整正则表达式中的.。 |
| * | 匹配零个或多个任意字符。这等同于完整正则表达式中的.*。 |
| [...] | 字符集可以用方括号表示,这与完整正则表达式类似。在字符类内部,与外部一样,反斜杠没有特殊含义。 |
在“通配符”模式下,通配符不能被转义。在“WildcardUnix ”模式下,字符 '\' 用于转义通配符。
例如,如果处于通配符模式,且字符串中包含文件名,我们可以使用*.html 来识别 HTML 文件。这将匹配零个或多个字符,后跟一个点,再后跟 '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
);零宽度正向和零宽度负向前瞻断言(?=pattern)和(?!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 theletter”。单词“letter”也被捕获(因为有括号)。我们可以像这样查看捕获的文本:
QString captured = rx.cap(1); // captured == "letter"这将捕获第一组捕获括号内的文本(从左到右计数捕获的左括号)。括号从 1 开始计数,因为 cap(0) 表示整个匹配的正则表达式(在大多数正则表达式引擎中等同于 '&')。
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,匹配到 'OneEricanotherEirik, 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] 表示网址,以此类推。
为了模拟 shell 的匹配行为,我们可以使用通配符模式。
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$。 请注意,除非使用*.htm*(这也会匹配 'test.html.bak'),否则无法用通配符同时匹配.html 和.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 的正则表达式模式可能会悄然改变语义。因此,有必要审查所使用的正则表达式模式。最显著的隐式不兼容情况包括:
- 若要使用超过 2 位数的十六进制转义序列(如
\xHHHH),则必须使用大括号。类似\x2022的模式需要移植为\x{2022},否则它将匹配一个空格(0x20)后跟字符串"22"。一般而言,强烈建议在\x转义序列中始终使用大括号,无论指定的位数是多少。 - 类似
{,n}的 0 到 n 量化的表达式需要转换为{0,n}以保持语义一致。否则,诸如\d{,3}之类的模式将匹配一个数字后跟精确字符串"{,3}"。 - QRegExp 默认进行支持 Unicode 的匹配,而QRegularExpression 则需要单独的选项;更多详细信息请参见下文。
- QRegExp 中的 c{.} 默认匹配所有字符,包括换行符。QRegularExpression 默认排除换行符。若要包含换行符,请设置QRegularExpression::DotMatchesEverythingOption 模式选项。
有关QRegularExpression 支持的正则表达式语法概述,请参阅pcrepattern(3)手册页,该手册页描述了 PCRE(Perl 兼容正则表达式的参考实现)支持的模式语法。
从 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();
// ...
}Unicode 属性支持
使用 QRegExp 时,诸如\w 、\d 等字符类会匹配具有相应 Unicode 属性的字符:例如,\d 会匹配任何具有 UnicodeNd (十进制数字)属性的字符。
默认情况下,当使用QRegularExpression 时,这些字符类仅匹配 ASCII 字符:例如,\d 仅精确匹配0-9 ASCII 范围内的字符。可以通过使用QRegularExpression::UseUnicodePropertiesOption 模式选项来更改此行为。
通配符匹配
在QRegularExpression 中没有直接进行通配符匹配的方法。不过,提供了QRegularExpression::wildcardToRegularExpression()方法,用于将glob模式转换为兼容Perl的正则表达式,从而实现该功能。
例如,如果你有如下代码:
你可以将其重写为:
auto wildcard = QRegularExpression(QRegularExpression::wildcardToRegularExpression("*.txt"));不过请注意,某些类似 shell 的通配符模式可能无法转换为您预期的结果。如果直接使用上述函数进行转换,以下示例代码会悄无声息地出现错误:
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()的效果:若启用该选项,将反转量词的贪婪性(贪婪的量词变为懒惰的,反之亦然)。
Caret 模式
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 | 这提供了一种简单的模式匹配语法,类似于 shell(命令解释器)中用于“文件通配”的语法。参见QRegExp wildcard matching 。 |
QRegExp::WildcardUnix | 4 | 这与“通配符”类似,但行为与 Unix 命令行解释器一致。通配符可以通过字符“\”进行转义。 |
QRegExp::FixedString | 2 | 该模式是一个固定字符串。这相当于对一个字符串应用 RegExp 模式,其中所有元字符均使用escape() 进行转义。 |
QRegExp::W3CXmlSchema11 | 5 | 该模式是 W3C XML Schema 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
返回一个文本字符串,解释正则表达式模式无效的原因;否则返回“未发生错误”。
另请参阅 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() 的设置方式不同。
例如,如果正则表达式为blue,那么只有当输入为blue 时,exactMatch() 才会返回true 。对于输入bluebell 、blutak 和lightblue ,exactMatch() 返回false ,而matchedLength() 将分别返回 4、3 和 0。
尽管该函数是常量,但它会设置matchedLength()、capturedTexts()、pos()。
另请参阅 indexIn() 和lastIndexIn()。
QStringList QRegExp::filterList(const QStringList &stringList) const
返回一个列表,其中包含在stringList 中与该正则表达式匹配的所有字符串。
int QRegExp::indexIn(const QStringList &list, int from) const
返回在list 中该正则表达式首次精确匹配的索引位置,从索引位置from 开始向前搜索。如果没有匹配项,则返回-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尽管该函数为常量,但它会设置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 开始向后搜索。如果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)对于零长度匹配,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、 \2after, ...等模式将分别替换为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 可启用类似简单shell的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 通过Move操作赋值给此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)
返回key 的哈希值,并使用seed 作为计算的种子。
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.