特殊符号和字符
符号
表示法 | 描述 | 正则表达式示例 |
---|---|---|
literal | 匹配文本字符串的字面值literal | aaa |
re1|re2 | 匹配正则表达式re1或re2 | aaa|bbb |
. | 匹配任何字符(除了\n) | b.b |
^ | 匹配字符串起始部分 | ^/bin |
$ | 匹配字符串结束部分 | *.sh$ |
* | 匹配0次或者多次前面出现的正则表达式 | [0-9]* |
+ | 匹配1次或者多次前面出现的正则表达式 | [0-9]+ |
? | 匹配0次或者1次前面出现的正则表达式 | zoo? |
{N} | 匹配N次前面出现的正则表达式 | [0-9]{3} |
{M,N} | 匹配m~N次前面出现的正则表达式 | [0-9]{3} |
[…] | 匹配来自字符集的任意一个字符 | [13579] |
[…x-y…] | 匹配0~9范围中的任意一个字符 | [0-9] |
[^…] | 不匹配此字符集中出现的任何一个字符,包括某一范围的字符集 | [abc][0-9a-zA-Z] |
(*|+|?|{})? | 用于匹配上面频繁出现/重复出现符号的非贪婪版本(*、+、?、{}) | .*?[a-z]] |
(…) | 匹配封闭的正则表达式,然后另存为子组 | ([0-9]{3})?,f(oo|o)bar |
特殊字符
表示法 | 描述 | 正则表达式示例 |
---|---|---|
\d | 匹配任何十进制数字,与[0-9]一致,(\D与\d相反) | \d+ |
\w | 匹配任何字母数字字符,与[0-9a-zA-A]一致,(\W与之相反) | \w+ |
\s | 匹配任何空格字符,与[\n\r\t\r\v\f] 形同,(\S与之相反) | \s+ |
\b | 匹配任何单词边界,(\B与之相反) | \bThe\b |
\N | 保存已保存的子组N(参看上面的(…)) | price:\16 |
\c | 逐字匹配任何特殊字符c(即,仅按照字面意思匹配,不匹配特殊含义) | \\,\*,\. |
\A(\Z) | 匹配字符串的起始(结束)(另见上面的^和$) | \Addd |
扩展表示法
表示法 | 描述 | 正则表达式示例 |
---|---|---|
(?iLmsux) | 在正则表达式中嵌入一个或者多个特殊"标记"参数(或者通过 函数/方法) | (?x),(?im) |
(?:…) | 表示一个匹配不用保存的分组 | (?:\w+.)* |
(?P<name>) | 像一个仅由name标识而不是数字ID标识的正则分组匹配 | (?P<data>) |
(?P=name) | 在同一字符串中匹配由(?P<name>)分组之前的文本 | (?P=data) |
(?#…) | 表示注释,所有内容都被忽略 | (?#comment) |
(?=…) | 匹配条件是如果…出现的之后的位置,而不使用输入字符串;称作正向前视断言 | (?=.com) |
(?!..) | 匹配条件是如果…不出现的之后的位置,而不使用输入字符串;称作负向前视断言 | (?!.net) |
(?<=…) | 匹配条件是如果…出现的之前的位置,而不使用输入字符串;称作正向后视断言 | (?<=800-) |
(?<!..) | 匹配条件是如果…不出现的之前的位置,而不使用输入字符串;称作正向后视断言 | (?<!192\.168\.) |
(?(id/name)Y|N) | 如果分组所提供的id或者name存在,就返回正则表达式的条件匹配Y,如果不存在,就返回N;|N是可选项 | (?(1)y|x) |
正则前面的 (?i) (?s) (?m) (?is) (?im) 是什么意思?
这是内联匹配模式,通常用内联匹配模式代替使用枚举值RegexOptions指定的全局匹配模式,写起来更简洁。
- (?i) 表示所在位置右侧的表达式开启忽略大小写模式
- (?s) 表示所在位置右侧的表达式开启单行模式。
注意:(?s)通常在匹配有换行的文本时使用 - (?m) 表示所在位置右侧的表示式开启指定多行模式。
更改 ^ 和 $ 的含义,以使它们分别与任何行的开头和结尾匹配,而不只是与整个字符串的开头和结 尾匹配。
注意:(?m)只有在正则表达式中涉及到多行的“^”和“$”的匹配时,才使用Multiline模式。
上面的匹配模式可以组合使用,比如(?is),(?im)。
另外,还可以用(?i:exp)或者(?i)exp(?-i)来指定匹配的有效范围。
JavaScript正则表达式m修饰符:
m修饰符规定正则表达式可以执行多行匹配。
m修饰符的作用是修改^和$在正则表达式中的作用,让它们分别表示行首和行尾。
在默认状态下,一个字符串无论是否换行只有一个开始^和结尾$,如果采用多行匹配,那么每一个行都有一个^和结尾$。
-
语法结构:
构造函数方式:
new RegExp("regexp","m")
-
对象直接量方式:
/regexp/m
-
浏览器支持:
- IE浏览器支持此元字符。
- 火狐浏览器支持此元字符。
- 谷歌浏览器支持此元字符。
实例代码:
实例一:
var str="This is an\n antzone good";
var reg=/an$/;
console.log(str.match(reg));
以上代码不能够匹配字符串"an",尽管"an"后面已经换行了,但是并没有采用多行匹配,所以不是字符串行的结尾。
实例二:
var str="This is an\n antzone good";
var reg=/an$/m;
console.log(str.match(reg));
以上代码可以匹配字符串"an",因为采用了多行匹配。
实例三:
var reg = /^b/;
var str = 'test\nbbs';
execReg(reg,str);
匹配失败,因为字符串的开头没有b字符。但是加上m修饰符之后:
实例四:
var reg = /^b/m;
var str = 'test\nbbs';
execReg(reg,str);
匹配到b,因为加了m修饰符之后,^已经表示行首,由于bbs在字符串第二行的行首,所以可以成功地匹配。
参考:
[1]: python核心编程(第三版) [美]Wesley Chun著,孙波翔,李斌,李晗 译
[2]: https://blog.csdn.net/codepen/article/details/40396769
[3]: https://www.jb51.net/article/101139.htm