正则表达式:语法

正则表达式:语法

正则表达式(Regular Expression),在代码中常简写为 regex、regexp 或 RE。
下文用的是js啦!

普通字符

一对方括号可以匹配一个字符,例如:

[ABC]:匹配[]中的所有字符。
[^ABC]:匹配除了[]中的所有字符。
[A-C]:表示一个区间。
[\s\S]:匹配任何字符。

\d:匹配一个数字字符。等价于[0-9]
\D:匹配一个非数字字符。等价于[^0-9]
\w:匹配字母、数字、下划线。等价于[A-Za-z0-9_]

突然发现,原来以前写的scanf("%[^\n]s",s)就是正则表达式啊XD

非打印字符

\s:匹配任何空白字符,包括空格、制表符、换页符等等。
\S:匹配任何非空白字符。
其他还有换行符、换页符、回车符等等。
更多参考资料:runoob

特殊字符

若要匹配这些特殊字符,必须使用\转义。

^:匹配字符串的开始位置。
$:匹配字符串的结尾位置。
.:匹配除\n以外的任何单字符。
*:匹配前面的子表达式零次或多次。
+:匹配前面的子表达式一次或多次。
?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
|:表示“或”。用圆括号()将所有选择项括起来,相邻的选择项之间用 |分隔。
其他还有{}[]()

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。

{n}:匹配n次。
{n,}:匹配至少n次。
{n,m}:最少匹配 n 次且最多匹配 m 次。注意在逗号和两个数之间不能有空格。
*:匹配前面的子表达式零次或多次。等价于{0,}
+:匹配前面的子表达式一次或多次。等价于{1,}
?:匹配前面的子表达式零次或一次。等价于{0,1}

*+ 限定符都是贪婪的,它们会尽可能多的匹配文字,在它们的后面加上一个? 就可以实现非贪婪或最小匹配。
例如字符串<h1> mogeko <h1>
<.*>会匹配整个字符串<h1> mogeko <h1>
<.*?>只会匹配到<h1>

定位符

定位符表示正则表达式的位置。

^:匹配输入字符串开始的位置。
$:匹配输入字符串结尾的位置。
\b:匹配一个单词边界,即字与空格间的位置。
\B:匹配非单词边界。

例如:er\B 能匹配 "verb" 中的 "er",但不能匹配 "never" 中的 "er"。
注意:不要将 ^ 的这种用法与中括号表达式内的用法混淆。

非捕获元字符

非捕获元包括?:?=(正向预查)、?!(负向预查)。

其实我也不知道怎么用,大概是:
在捕获组匹配时,会将满足捕获元形式的单元单独保存为一个匹配结果,而非捕获元不单独保存,只保存完整匹配结果。
也就是说,比如要匹配选择项,可以把?:放在第一个选项前。不过最后的结果是一样的啦!

修饰符

修饰符也称为标记,正则表达式的标记用于指定额外的匹配策略。
标记不写在正则表达式里,标记位于表达式之外,
格式为:/pattern/flags

常用的修饰符有:

i: ignore - 不区分大小写。
g:global - 全局匹配,查找所有的匹配项。
m: multi line - 多行匹配。使边界字符^$匹配每一行的开头和结尾。
s:使特殊字符. 中包含换行符\n

也可以组合使用,比如gigm

实例

匹配邮箱的正则表达式:
/\b\w{3,20}@\w+\.(?:com|org|cn)\b/g