0%

Regular expression

Regular Expression——正则表达式

正则表达式描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串,将匹配的子串替换或者从某个子串中取出某个符合条件的子串等

普通字符

普通字符包括没有显示指定为元字符的所有可打印和不可打印字符。这包括所有大写字母和小写字母,所有数字,所有标点符号和一些其他符号

非打印字符

非打印字符也可以是正则表达式的组成部分。下标列出了表示非打印字符的转义序列

字符 描述
\cx 匹配由x指明的而控制字符。例如\cM控制一个Control-M或回车符。x的值必须为A-Z或a-z之一。否则,将c视为一个原义的‘c’字符
\f 匹配一个换页符
\n 匹配一个换行符
\r 匹配一个回车符
\s 匹配任何空白字符,包括空格、制表符、换页符等等。等价于[ \f\n\r\t\v]。注意Unicode正则表达式会匹配全角空格符
\S 匹配任何非空白字符。等价于[^ \f\n\r\t\v ]
\t 匹配一个制表符
\v 匹配一个垂直制表符

特殊字符

许多元字符要求在试图匹配他们时特别对待。托要匹配他们,必须首先使字符“转义”,即,将反斜杠\放在他们前面。下标列出了正则表达式中的特殊字符

特殊字符 描述
$ 匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则 $ 也匹配‘\n’或‘\r’。要匹配\$本身需要使用 \ $
() 标记一个子表达式的开始和结束位置。字表达式可以获取供以后使用
* 匹配前面的子表达式零次或多次。
+ 匹配前面的子表达式一次或多次。
. 匹配除换行符\n以外的任何单字符
[ 标记一个中括号表达式的开始
? 匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
\ 将下一个字符标记为或特殊字符,或原义字符,或向后引用,或八进制转义符
^ 匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。
{ 标记限定符表达式的开始
| 指明两项之间的一个选择

限定符

限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*+?{n}{n,}{n,m}6种。

字符 描述
* 匹配前面的子表达式零次或多次
+ 匹配前面的子表达式一次或多次
匹配前面的子表达式零次或一次
{n} n是一个非负整数。匹配确定的n次。例如, ‘o{2}‘’不能匹配“Bob”中的‘o’,但是能匹配“food”中的两个o
{n,} n是一个非负整数。至少匹配n次
{n,m} m和n均为非负整数,其中n <= m。最少匹配n次且最多匹配m次。注意在逗号和两个数之间不能有空格

注意:

*、+限定符都是贪婪的,因为他们会尽可能多的匹配文字,只有在他们后面加上一个?就可以实现非贪婪或最小匹配。

例如,当我们在搜索HTML文档,以查找括在H1标记内的章节标题。该文本在文档中如下:

<H1>Chapter 1 - 介绍正则表达式</H1>

贪婪:下面的表达式匹配从开始小于符号(<)到关闭H1标记的大于符号(>)之间的所有内容

/<.*>/

非贪婪:如果您只需要匹配开始和结束H1标签,下面的非贪婪表达式只匹配 <H1>

/<.*?>/

如果指向匹配开始的H1标签,表达式则是:

/<\w+?>/

通过在* 、+ 或 ?限定符之后放置?,该表达式从“贪心”表达式转换为“非贪心”表达式或者最小匹配。

定位符

定位符能够将正则表达式固定到行首或行尾。还能够创建这样的表达式:这些正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾

定位符用来描述字符串或单词的边界,^$分贝指字符串的开始与结束,\b描述单词的前或后边界,\B表示非单词边界

正则表达式的定位符有:

字符 描述
^ 匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
$ 匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与 \n 或 \r 之后的位置匹配。
\b 匹配一个单词边界,即字与空格间的位置
\B 非单词边界匹配

注意:

不能将限定符与定位符一起使用。而且在紧靠换行或者单词边界的前面或后面不能有一个以上位置,因此不允许注入^*之类的表达式