正则表达式
正则表达式的用途:
(1)检查一个串是否含有某种子串
(2)将匹配的子串做替换或者从某个串中取出符合某个条件的子串
正则表达式的组成:
普通字符(如字符a到z),以及特殊字符(称为元字符)组成的文字模式。
普通字符:包括没有显式指定为元字符的所有可打印和不可打印字符。这包括所有大写和小写字母、所有数字、所有标点符号和一些其他符号。
非打印字符:
\cx:匹配由x指明的控制字符
\f:匹配一个换页符,等价于\x0c和\cL
\n:匹配一个换行符
\r:匹配一个回车符
\s:匹配任何空白字符,包括空格、制表符、换页符等
\S:匹配任何非空白字符
\t:匹配一个制表符
\w:匹配一个垂直制表符
特殊字符:
特殊字符是一些有特殊含义的字符,元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符“转义”,即将反斜杠(\)放在它们前面。
$:匹配输入字符串的结尾位置。如果设置了RegExp对象的Multiline属性,则$也匹配\n或\r,匹配$本身,使用\$
():标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。要匹配这些字符,请使用\(和\)
*:匹配前面的子表达式零次或多次。
+:匹配前面的子表达式一次或多次
. :匹配换行符\n之外的任何单字符
[:标记中括号表达式的开始。
?:匹配前面的子表达式零次或一次,或指明一个非贪婪限定符。
\:将下一个字符标记为特殊字符,或原义字符,或向后引用,或八进制转义符,例如‘n’匹配字符“n”,‘\n’匹配换行符,序列“\\”匹配“\”,而'\('匹配"("
^:匹配输入字符串的开始位置,除非在方括号表达式中使用,此时它表示不接受该字符集合。要匹配字符本身,用\^
{:标记限定符表达式的开始
|:指明两项之间的一个选择
限定符
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。有*,+,?,{n},{n,},{n,m}共6种
*:匹配前面的子表达式零次或多次。例如:zo*能匹配“z”以及“zoo”,*等价于{0,}
+:匹配前面的子表达式一次或多次。例如:zo*能匹配“zoo”以及“zo”,但不能匹配"z",+等价于{1,}
?:匹配前面的子表达式零次或一次。例如:do(es)?可以匹配“do”或“does”。?等价于{0,1}
{n}:n是一个非负整数,匹配确定的n次。比如,“o{2}”不能匹配“bod”中的o,但能匹配“food”中的o
{n,},n非负整数,至少匹配n次
{n,m},其中n<=m,至少匹配n次最多匹配m次
例如chaper1,chaper2,...chaper100等的匹配
/chaper[1-9][0-9]*/
注:*,+,?都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
例子:
<h1>chaper 1-introduce to regular expressions</h1>
下面的表达式匹配从开始小于符号(<)到关闭h1标记的大于符号(>)之间的所有内容
/<.*>/
如果只需要匹配开始h1标记,下面的“非贪心”表达式只匹配<h1>
/<.*?>/
通过在*,+,?限定符之后放置?,该表达式从贪心表达式转换为非贪心表达式或最小匹配。
定位符
定位符能够将正则表达式固定到行首或行尾。
^:匹配输入字符串开始的位置。如果设置了RegExp对象的Multiline属性,^还会与\n或\r之后的位置匹配。
$:匹配输入字符串结尾的位置。如果设置了RegExp对象的Multiline属性,$还会与\n或\r之前的位置匹配。
\b:匹配一个字边界,即字与空格间的位置。
\B:非字边界匹配
注:不能将限定符与定位点一起使用。由于在紧靠换行或者字边界的前面或后面不能有一个以上位置,因此不允许诸如^*之类的表达式。
若要匹配一行文本开始处的文本,请在正则表达式的开始使用^字符,不要将^的这种用法与中括号表达式内的用法混淆。
若要匹配一行文本的结束处的文本,请在正则表达式的结束处使用$字符。
若要在搜索章节标题时使用定位点,下面的正则表达式匹配一个章节标题,改标题只包含两个尾随数字,并且出现在行首
/^chaper [1-9][0-9]{0,1}/
真正的章节标题不仅出现行的开始处,而且它还是该行中仅有的文本,通过创建只匹配一行文本的开始和结尾的正则表达式,就可做到这一点。
/^chaper [1-9][0-9]{0,1}$/
选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。单用圆括号会有一个副作用,是相关的匹配会被缓存。此时可用?:放在第一个选项前来消除这种副作用。
还有两个非捕获源是?=和?!,前者为正向预查,后者为反向预查。
反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个字匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从1开始,最多可存储99个捕获的子表达式。每个缓冲区都可以使用'\n'访问,其中n为一个标识特定缓冲区的一位或两位十进制数。
可以用非捕获元素'?:','?='或'?!'来重写捕获,忽略对相关匹配的保存。
方向引用最简单的应用,查找文本中两个相同的相邻单词的匹配项。
Is is the cost of of gasoline going up up?
上面的句子明显有多个重复的单词。
/\b([a-z]+) \1\b/gi
捕获的正则表达式,[a-z]+指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好有括号表达式匹配。\1指定第一个子匹配项。字边界元字符确保只检测整个单词。
反向引用还可以将通用资源指示符(uri)分解为其组件。假定一个uri分解为协议、域地址和页、路径
http://www.runoob.com:80/html/html-tutorial.html
下面的正则表达式提供该功能:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/
第一个括号子表达式匹配在冒号和两个正斜杠前面的任何单词。http
第二个括号子表达式捕获地址的域地址部分。匹配/和:之外的一个或多个字符。www.runoob.com
第三个括号子表达式捕获端口号端口号。匹配冒号后面的零个或多个数字。只能重复一次该子表达式。:80
第四个括号捕获web地址指定的路径。匹配不包括#或空格字符的任何字符序列。/html/html-tutorial.html