描述
QRegExp 类使用正则表达式提供模式匹配。
正则表达式或"正则表达式"是一种用于匹配文本中子字符串的模式。这在许多情况下都很有用,例如,
- 验证
正则表达式可以测试子字符串是否满足某些条件,例如是整数或不包含空格。 - 搜索
正则表达式提供了比简单的子字符串匹配更强大的模式匹配,例如,匹配一个单词 mail、letter 或 correspondence,但没有一个单词 email、mailman、mailer、letterbox 等。 - 搜索和替换
正则表达式可以用不同的子字符串替换子字符串的所有匹配项,例如,将所有出现的 & 替换为 &,除非 & 后面已经跟着 amp;。 - 字符串拆分
正则表达式可用于标识字符串应拆分的位置,例如拆分制表符分隔的字符串。
介绍
正则表达式由表达式、****量词 和断言 构建而成。最简单的表达式是一个字符,例如 x 或 5。表达式也可以是用方括号括起来的一组字符。[ABCD] 将匹配 A 或 B 或 C 或 D。我们可以将这个表达式写成 [A-D] ,并且与英语字母表中任何大写字母匹配的表达式都写成 [A-Z]。
量词指定必须匹配的表达式的出现次数。x{1,1} 表示匹配 1 且仅匹配一个 x。x{1,5} 表示匹配包含至少一个 x 但不超过 5 个的 x 字符串行。
请注意,通常不能使用正则表达式来检查平衡的括号或标记。例如,如果标签没有嵌套,则可以编写正则表达式以匹配开始的 html 及其结束 键**,但如果标记是嵌套的,则相同的正则表达式将匹配具有错误结束** 符的开始标记。对于粗体 的片段,第一个将与第一个匹配,这是不正确的。但是,可以编写一个正确匹配嵌套括号或标记的正则表达式,但前提是嵌套级别的数量是固定的和已知的。如果嵌套级别的数量不是固定的和已知的,则不可能编写不会失败的正则表达式。****
假设我们希望正则表达式匹配 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}KaTeX parse error: Undefined control sequence: \d at position 10: 。它也可以写成 ^\̲d̲\d{0,1},即从字符串的开头开始,匹配一个数字,紧接着是 0 或 1 位数字。在实践中,它将被写成 ^\d\d?KaTeX parse error: Undefined control sequence: \d at position 48: ...达式成为可选的。正则表达式 ^\̲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} 自动量化,因此我们可以将正则表达式简化为邮件,即"m"后跟"a",后跟"i",后跟"l"。现在我们可以使用竖线 |,这意味着 or,包括其他两个单词,因此我们匹配三个单词中的任何一个的正则表达式变为 mail|letter|correspondence 。匹配"邮件"或"信件"或"通信"。虽然此正则表达式将匹配我们想要匹配的三个单词之一,但它也将匹配我们不想匹配的单词,例如"电子邮件"。为了防止正则表达式匹配不需要的单词,我们必须告诉它在单词边界处开始和结束匹配。首先,我们将正则表达式括在括号中,(mail|letter|correspondence)。括号将表达式组合在一起,它们标识了我们希望捕获的正则表达式的一部分。将表达式括在括号中允许我们将其用作更复杂的正则表达式中的组件。它还允许我们检查这三个单词中的哪一个是实际匹配的。为了强制匹配在单词边界上开始和结束,我们将正则表达式括在 \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"。
符号 | 意思 |
---|---|
c | 一个字符代表它自己,c匹配字符c,除非这个 字符有特殊含义 |
\c | 一个反斜杠加一个字符,匹配字符本身,例外: ^:匹配字符串开头的文字插入符 |
\a | 匹配一个响铃符 |
\f | 匹配一个分页符 |
\n | 匹配一个换行符 |
\r | 匹配一个回车符 |
\t | 匹配一个水平制表符 |
\v | 匹配一个垂直制表符 |
\xhhh | 匹配与十六进制数hhhh(在0x0000和OxFFF之间)对应的Unicode字符 |
\0ooo | 匹配总数为o00(介于0和0377之间)的ASCI/拉丁字符。 |
. | 匹配任意字符 |
\d | 匹配一个数字 |
\D | 匹配一个非数字 |
\s | 匹配一个空格 |
\S | 匹配一个非空格 |
\w | 匹配一个单词 |
\W | 匹配一个非单词 |
字符集
方括号表示与方括号中包含的任何字符匹配。上述字符集缩写可以出现在方括号中的字符集中。除字符集缩写和以下两个例外情况外,字符在方括号中没有特殊含义。
字符 | 含义 |
---|---|
^ | 如果字符集作为第一个字符出现(即紧接在左方括号之后),则插入符号将否定该字符集。[abc] 匹配 'a' 或 'b' 或 'c',但 [^abc] 匹配 'a' 或 'b' 或 'c' 以外的任何内容。 |
- | 破折号表示字符范围。[W-Z] 匹配"W"或"X"或"Y"或"Z"。 |
使用预定义的字符集缩写比跨平台和语言使用字符范围更具可移植性。例如,[0-9] 匹配西方字母表中的数字,但 \d 匹配任何字母表中的数字。
注意:在其他正则表达式文档中,字符集通常称为"字符类"。
量词
默认情况下,表达式由{1,1}自动量化,即它应该只出现一次。在下面的列表中,E代表表达式。表达式是一个字符,或者是一组字符的缩写,或者是方括号中的一组字符,或者是圆括号中的表达式。
量词 | 含义 |
---|---|
E? | 这个量词表示E可以出现零次或一次。这意味着前面的表达式是可选的,因为它会匹配无论是否找到该表达式。E? 和 E{0,1} 是等价的。例如,dents? 匹配 'dent' 或 'dents'。这个量词用于正则表达式中,用于指定某个模式的可选性。在上述例子中,"dents?" 将匹配 'dent' 或 'dents' 这两个单词,其中 "s" 的出现是可选的。 |
E+ | 匹配一个或多个出现的E.E+与E{1, }相同。例如,0+匹配"0""00""000"等 |
E* | 匹配零次或多次出现的 E。它与 E{0,} 相同。* 量词经常在错误中使用,其中应该使用 +。例如,如果在表达式中使用 \s*$ 来匹配以空格结尾的字符串,它将匹配每个字符串,因为 \s*$ 表示匹配零个或多个空格,后跟字符串末尾。匹配至少具有一个尾部空格字符的字符串的正确正则表达式是 \s+$。 |
E{n} | 匹配出现n次E的字符 |
E{n,} | 至少出现n次 |
E{,m} | 最多出现m次 |
E{n.m} | 至少出现n次,最多出现m次 |
断言
断言在regexp中出现的地方对文本做出一些声明,但是它们不匹配任何字符。在下面的列表中,E代表任何表达式。
断言 | 含义 |
---|---|
^ | 插入符号表示字符串的开头。如果你想匹配一个文本 ^,你必须通过写 \^ 来转义它。例如,^#include 将仅匹配以字符"#include"开头的字符串。(当插入符号是字符集的第一个字符时,它具有特殊含义,请参阅字符集。 |
$ | KaTeX parse error: Undefined control sequence: \d at position 13: 表示字符串的末端。例如,\̲d̲\s* 将匹配以数字结尾的字符串(可选),后跟空格。如果你想匹配一个文本 ,你必须通过写入 \\ 来转义它。 |
\b | 一个词的边界。例如,正则表达式 \bOK\b 表示紧跟在单词边界(例如字符串或空格的开头)之后的字母"O",然后是紧接在另一个单词边界(例如字符串末尾或空格)之前的字母"K"。但请注意,该断言实际上并不匹配任何空格,因此如果我们编写 (\bOK\b) 并且我们有一个匹配项,即使字符串是"It's OK now",它也只会包含"OK"。 |
\B | 非单词边界。如果 \b 为 false,则此断言为 true。例如,如果我们在"Left on"中搜索 \Bon\B,则匹配将失败(空格和字符串末尾不是非单词边界),但它会在"tonne"中匹配。 |
(?=E) | 正向先行断言(Positive lookahead)是一种正则表达式中的断言语法,如果在当前位置匹配成功,则断言为真。例如,const(?=\s+char) 表达式匹配 'const',但仅当其后紧跟着 'char' 时才为真,比如在 'static const char *' 中。(与 const\s+char 进行对比,后者匹配 'static const char *' 的整个字符串)。这种断言用于对某些模式进行前瞻性判断,以确保后续的匹配符合预期。 |
?!E | 负向先行断言(Negative lookahead)是正则表达式中的一种断言语法,如果在当前位置匹配失败,则断言为真。例如,const(?!\s+char) 表达式匹配 'const',但当其后紧跟着 'char' 时,断言会失败,即不匹配。这意味着该表达式可以用于排除某些特定的模式,确保后续的匹配不包含指定的内容。在给定的例子中,'const' 只有在不跟随 'char' 的情况下才会匹配成功。 |
通配符匹配
大多数命令shell(如bash或cmd.exe)都支持"文件全局搜索",即通过使用通配符来识别一组文件的能力。函数的作用是:在regexp和通配符模式之间进行切换。通配符匹配比完整的regexp简单得多,并且只有四个特性:
通配符 | 含义 |
---|---|
c | 除了下面提到的字符外,任何字符都代表自己。因此c与字符c匹配。 |
? | 匹配任何单个字符。它与完全正则表达式中的 . 相同。 |
* | 匹配零个或多个任何字符。它与完整正则表达式中的 .* 相同。 |
[...] | 字符集可以用方括号表示,与完整的正则表达式类似。在字符集内部,就像在外部一样,反斜杠没有特殊含义。这意味着在字符集中使用反斜杠不会具有转义或特殊的含义。例如,[abc] 表示匹配字符 'a'、'b' 或 'c' 中的任意一个。在字符集内部,元字符(如点号、星号等)通常被当作普通字符对待,而不是其正则表达式的特殊功能。然而,需要注意的是,方括号内的连字符(-)有时候会表示字符范围,例如 [a-z] 表示匹配从小写字母'a'到'z'之间的任意一个字符。 |