此快速入门可让你快速了解正则表达式。显然,此简要介绍无法解释有关正则表达式的全部内容。有关详细信息,请参阅正则表达式教程。快速入门中的每个主题都对应教程中的一个主题,因此你可以轻松地在两者之间来回切换。
许多应用程序和编程语言都有自己的正则表达式实现,通常与其他实现有细微差别,有时有很大差别。当两个应用程序使用不同的正则表达式实现时,我们说它们使用不同的“正则表达式风格”。此快速入门解释了最流行的正则表达式风格支持的语法。
正则表达式或简称 regex 是描述一定量文本的模式。在此网站上,正则表达式以灰色阴影显示为 regex。这实际上是一个完全有效的 regex。这是最基本的模式,只匹配文本 regex。匹配在此网站上以蓝色突出显示。我们使用术语“字符串”来表示应用正则表达式的文本。字符串以绿色突出显示。
正则表达式中具有特殊含义的字符以各种不同的颜色突出显示。regex ([Rr]egexp?)\? 以紫色显示元标记,以绿色显示分组,以橙色显示字符类,以蓝色显示量词和其他特殊标记,以灰色显示转义字符。
最基本的正则表达式由单个文本字符组成,例如 a。它匹配字符串中该字符的首次出现。如果字符串是 Jack is a boy,它匹配 J 之后的 a。
此 regex 也可匹配第二个 a。它仅在你告诉 regex 引擎在第一次匹配后开始搜索字符串时才这样做。在文本编辑器中,你可以使用其“查找下一个”或“向前搜索”功能来执行此操作。在编程语言中,通常有一个单独的函数,你可以在上一次匹配后调用该函数以继续搜索字符串。
正则表达式中有十二个字符具有特殊含义:反斜杠 \、脱字符 ^、美元符号 $、句号或点 .、竖线或管道符号 |、问号 ?、星号或星形 *、加号 +、左圆括号 (、右圆括号 )、左方括号 [ 和左大括号 {。这些特殊字符通常称为“元字符”。单独使用时,它们中的大多数都是错误的。
如果要在正则表达式中将其中任何一个字符用作文字,则需要使用反斜杠对其进行转义。如果你想匹配 1+1=2,则正确的正则表达式是 1\+1=2。否则,加号具有特殊含义。
可以使用特殊字符序列在正则表达式中放置不可打印字符。使用 \t 匹配制表符(ASCII 0x09),使用 \r 匹配回车符(0x0D),使用 \n 匹配换行符(0x0A)。更奇特的不可打印字符有 \a(响铃,0x07)、\e(转义,0x1B)、\f(换页符,0x0C)和 \v(垂直制表符,0x0B)。请记住,Windows 文本文件使用 \r\n 作为行尾,而 UNIX 文本文件使用 \n。
如果你的应用程序支持 Unicode,请使用 \uFFFF 或 \x{FFFF} 插入 Unicode 字符。 \u20AC 或 \x{20AC} 匹配欧元货币符号。
如果你的应用程序不支持 Unicode,请使用 \xFF 通过字符集中的十六进制索引匹配特定字符。 \xA9 在 Latin-1 字符集中匹配版权符号。
所有不可打印字符都可以直接在正则表达式中使用,或作为字符类的部分使用。
“字符类别”仅匹配多个字符中的一个。若要匹配 a 或 e,请使用 [ae]。您可以在 gr[ae]y 中使用它来匹配 gray 或 grey。字符类别仅匹配单个字符。 gr[ae]y 不匹配 graay、graey 或任何此类内容。字符类别中字符的顺序无关紧要。
您可以在字符类别中使用连字符来指定字符范围。 [0-9] 匹配 0 到 9 之间的单个数字。您可以使用多个范围。 [0-9a-fA-F] 匹配单个十六进制数字,不区分大小写。您可以组合范围和单个字符。 [0-9a-fxA-FX] 匹配十六进制数字或字母 X。
在左方括号后键入脱字符号会否定字符类别。结果是字符类别匹配字符类别中没有的任何字符。 q[^x] 在 question 中匹配 qu。它不匹配 Iraq,因为在 q 之后没有字符与否定的字符类别匹配。
\d 匹配单个数字字符,\w 匹配“单词字符”(字母数字字符加上下划线),\s 匹配空白字符(包括制表符和换行符)。实际匹配的字符取决于所使用的软件。在现代应用程序中,它们包括非英语字母和数字。
点匹配单个字符,换行字符除外。大多数应用程序都有“点匹配全部”或“单行”模式,使点匹配任何单个字符,包括换行符。
gr.y 匹配 gray、grey、gr%y 等。谨慎使用点。通常,字符类或否定字符类更快且更精确。
锚点不匹配任何字符。它们匹配位置。^ 匹配字符串开头,$ 匹配字符串结尾。大多数正则表达式引擎都有“多行”模式,使 ^ 在任何换行符后匹配,$ 在任何换行符前匹配。例如,^b 仅匹配 bob 中的第一个 b。
\b 匹配在单词边界处。单词边界是 \w 可以匹配的字符和 \w 无法匹配的字符之间的位置。\b 还在字符串开头和/或结尾处匹配,如果字符串中的第一个和/或最后一个字符是单词字符。\B 在 \b 无法匹配的每个位置处匹配。
交替是“或”的正则表达式等效项。cat|dog 在 About cats and dogs 中匹配 cat。如果再次应用正则表达式,它将匹配 dog。您可以添加任意多个备选方案:cat|dog|mouse|fish。
交替具有所有正则表达式运算符中最低的优先级。cat|dog food 匹配 cat 或 dog food。要创建匹配 cat food 或 dog food 的正则表达式,你需要对备选方案进行分组:(cat|dog) food。
问号使正则表达式中的前一个标记变为可选。colou?r 匹配 colour 或 color。
星号或星号告诉引擎尝试匹配前一个标记零次或多次。加号告诉引擎尝试匹配前一个标记一次或多次。<[A-Za-z][A-Za-z0-9]*> 匹配没有任何属性的 HTML 标记。<[A-Za-z0-9]+> 更容易编写,但匹配无效标记,例如 <1>。
使用大括号指定特定的重复次数。使用 \b[1-9][0-9]{3}\b 匹配 1000 到 9999 之间的数字。\b[1-9][0-9]{2,4}\b 匹配 100 到 99999 之间的数字。
重复运算符或量词是贪婪的。它们尽可能地扩展匹配,并且仅在必须满足正则表达式的其余部分时才回退。正则表达式 <.+> 在 This is a <EM>first</EM> test 中匹配 <EM>first</EM>。
在量词后放置一个问号以使其变为惰性。<.+?> 在上述字符串中匹配 <EM>。
更好的解决方案是按照我的建议,谨慎使用点。使用 <[^<>]+> 来快速匹配 HTML 标签,而不用考虑属性。取反字符类比点更具体,这有助于正则表达式引擎快速找到匹配项。
在多个标记周围放置括号以将它们组合在一起。然后可以将量词应用于该组。例如,Set(Value)? 匹配 Set 或 SetValue。
括号创建一个捕获组。上面的示例有一个组。匹配后,如果匹配 Set,则第 1 组不包含任何内容。如果匹配 SetValue,则它包含 Value。如何访问组的内容取决于所使用的软件或编程语言。第 0 组始终包含整个正则表达式匹配项。
使用特殊语法 Set(?:Value)? 对标记进行分组,而不创建捕获组。如果您不打算使用组的内容,这将更有效。不要将非捕获组语法中的问号与量词混淆。
在正则表达式中,可以使用反向引用 \1 来匹配捕获组匹配的相同文本。 ([abc])=\1 匹配 a=a、b=b 和 c=c。它不匹配其他任何内容。如果正则表达式有多个捕获组,则从左到右按其左括号的顺序对它们进行编号。
如果正则表达式有许多组,则跟踪它们的编号可能会很麻烦。通过给组命名,让正则表达式更容易阅读。 (?<mygroup>[abc])=\k<mygroup> 与 ([abc])=\1 相同,不同之处在于您可以通过名称引用该组。
\p{L} 匹配给定 Unicode 类别中的单个字符。 L 代表字母。 \P{L} 匹配不在给定 Unicode 类别中的单个字符。 您可以在教程中找到Unicode 类别的完整列表。
环视是一种特殊类型的组。组内的标记通常匹配,但随后正则表达式引擎使组放弃其匹配,只保留结果。环视匹配位置,就像锚点一样。它不会扩展正则表达式匹配。
q(?=u) 匹配 question 中的 q,但不匹配 Iraq 中的 q。这是正向环视。 u 不是整体正则表达式匹配的一部分。环视在字符串中 u 之前的每个位置匹配。
q(?!u) 匹配 Iraq 中的 q,但不匹配 question 中的 q。这是否定环视。尝试环视内的标记,放弃其匹配,并反转结果。
要向后环视,请使用后向环视。正向后向环视 (?<=a)b 匹配 abc 中的 b。否定后向环视 (?<!a)b 无法匹配 abc。
您可以在环视中使用完整的正则表达式。大多数应用程序只允许在后向环视中使用固定长度的表达式。
许多应用程序都有一个选项,可能标记为“自由间距”或“忽略空格”或“注释”,这使得正则表达式引擎忽略未转义的空格和换行符,并使 # 字符开始一个一直运行到行尾的注释。这允许你使用空格以一种对人类来说更易于阅读的方式来格式化你的正则表达式,从而使其更易于维护。
| 快速入门 | 教程 | 工具和语言 | 示例 | 参考 | 书评 |
| 简介 | 正则表达式快速入门 | 正则表达式教程 | 替换字符串教程 | 应用程序和语言 | 正则表达式示例 | 正则表达式参考 | 替换字符串参考 | 书评 | 可打印 PDF | 关于此网站 | RSS 源和博客 |
页面 URL:https://regexper.cn/quickstart.html
页面上次更新:2021 年 8 月 15 日
网站上次更新:2024 年 3 月 15 日
版权所有 © 2003-2024 Jan Goyvaerts。保留所有权利。