正则表达式——语法
正则表达式(regular expression)——描述一种字符串匹配模式,可以用来检测一个字符串是否包含特定的子串、用其他字符串将其代替、提取出某个符合要求的子串。
正则表达式 由普通字符 和 元字符 组成。
普通字符:
普通字符包括没有显示指定为元字符的所有可打印或不可打印字符。其包括:大小字母、数字、标点符号和一些其他符号。
非打印字符:
特殊字符:
许多元字符要求在试图匹配它们时特别对待。若要匹配这些特殊字符,必须首先使字符"转义",即,将反斜杠字符 (\) 放在它们前面。下表列出了正则表达式中的特殊字符:
限定符:
限定符用来指定正则表达式的一个给定组件必须要出现多少次才能满足匹配。
- *
- +
- ?
- {n}
- {n,}
- {n,m}
定位符
定位符用来描述字符串或单词的边界。定位符能够将正则表达式固定到行首或行尾。正则表达式出现在一个单词内、在一个单词的开头或者一个单词的结尾。
^和$分别指字符串的开始与结束,
\b描述单词的前或后边界,
\B表示非单词边界。
选择
用圆括号将所有选择项括起来,相邻的选择项之间用|分隔。但用圆括号会有一个副作用,是相关的匹配会被缓存,此时可用?:放在第一个选项前来消除这种副作用。
其中?:是非捕获元之一,还有两个非捕获元是?=和?!,这两个还有更多的含义,前者为正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来匹配搜索字符串,后者为负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串。
反向引用
对一个正则表达式模式或部分模式两边添加圆括号将导致相关匹配存储到一个临时缓冲区中,所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 '\n' 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。
可以使用非捕获元字符 '?:'、'?=' 或 '?!' 来重写捕获,忽略对相关匹配的保存。
应用示例:
- 由于章节编号在大的输入文档中会很可能超过九,所以需要一种方式来处理两位或三位章节编号。限定符给您这种能力。下面的正则表达式匹配编号为任何位数的章节标题
<script>
var str="Chapter 9 Overview";
var exp_chapter=/Chapter [1-9][0-9]*/;
var objexp=new RegExp(exp_chapter);
alert(objexp.test(str));
</script>上面这段代码的执行结果为显示一个alert,文本值为true。
*、+和?限定符都是贪婪的,因为它们会尽可能多的匹配文字,只有在它们的后面加上一个?就可以实现非贪婪或最小匹配。
- 匹配第一个以“<”开始 到 第一个以”>”结束之间的字符串部分。
<script>
var str="<h1>Chapter 1 – Introduction to Regular Expressions</h1>";
var str_2="<h1>..."
var exp_chapter=/<.*>/;
var exp_2=/<.*?>/
var objexp=new RegExp(exp_chapter);
var objexp_2=new RegExp(exp_chapter);
alert(objexp_2.test(str_2));
</script>var exp_2=/<.*?>/ 该正则表达式只会匹配第一个以“<”开始 到 第一个以”>”结束之间的字符串部分。
- 匹配Chapter单词
<script>
var str="<h1>Chapter 1 – Introduction to Regular Expressions</h1>"
var exp=/\bChapter/;
var objexp=new RegExp(exp);
alert(objexp.test(str));
</script>显示结果:true
var exp=/\bChapter/;改为var exp=/\BChapter/;将返回false
var exp_middle=/\Bapt/;该正则表达是能匹配在单词Chapter,因为\B 非字边界运算符反向引用的最简单的、最有用的应用之一,是提供查找文本中两个相同的相邻单词的匹配项的能力。以下面的句子为例:
Is is the cost of of gasoline going up up?上面的句子很显然有多个重复的单词。如果能设计一种方法定位该句子,而不必查找每个单词的重复出现,那该有多好。下面的正则表达式使用单个子表达式来实现这一点:
/\b([a-z]+) \1\b/gi捕获的表达式,正如 [a-z]+ 指定的,包括一个或多个字母。正则表达式的第二部分是对以前捕获的子匹配项的引用,即,单词的第二个匹配项正好由括号表达式匹配。\1 指定第一个子匹配项。字边界元字符确保只检测整个单词。否则,诸如"is issued"或"this is"之类的词组将不能正确地被此表达式识别。
正则表达式后面的全局标记 (g) 指示,将该表达式应用到输入字符串中能够查找到的尽可能多的匹配。表达式的结尾处的不区分大小写 (i) 标记指定不区分大小写。多行标记指定换行符的两边可能出现潜在的匹配。
- 反向引用还可以将通用资源指示符 (URI) 分解为其组件。假定您想将下面的 URI 分解为协议(ftp、http 等等)、域地址和页/路径:
http://www.w3cschool.cc:80/html/html-tutorial.html下面的正则表达式提供该功能:
/(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/第一个括号子表达式捕获 Web 地址的协议部分。该子表达式匹配在冒号和两个正斜杠前面的任何单词。
第二个括号子表达式捕获地址的域地址部分。子表达式匹配 / 或 : 之外的一个或多个字符。
第三个括号子表达式捕获端口号(如果指定了的话)。该子表达式匹配冒号后面的零个或多个数字。只能重复一次该子表达式。
最后,第四个括号子表达式捕获 Web 地址指定的路径和/或页信息。该子表达式能匹配不包括 # 或空格字符的任何字符序列。
将正则表达式应用到上面的 URI,各子匹配项包含下面的内容:
- 第一个括号子表达式包含"http"
- 第二个括号子表达式包含"www.w3cschool.cc"
- 第三个括号子表达式包含":80"
- 第四个括号子表达式包含"/html/html-tutorial.html"