在前面已经涉及了一些正则表达式的用法,现在将系统地学习正则表达式的语法和用途。正则表达式主要用于进行字符串的模式匹配,例如判断一个字符串是否符合指定格式等。例如在windows下搜索文件,可以用“*”或者“?”这样的通配符。在正则表达式的语法中,有更多这样的符号用于表示一个字符串的模式,表7.1列出了所有的特殊符号,它们也被称为元字符。
表7.1 正则表达式中的元字符
字 符
|
说 明
|
\
|
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”
|
^
|
匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与“\n”或“\r”之后的位置匹配
|
$
|
匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$还会与“\n”或“\r”之前的位置匹配
|
*
|
零次或多次匹配前面的字符或子表达式。例如,zo* 匹配“z”和“zoo”。* 等效于{0,}
|
+
|
一次或多次匹配前面的字符或子表达式。例如,“zo+”与“zo”和“zoo”匹配,但与“z”不匹配。+ 等效于 {1,}
|
?
|
零次或一次匹配前面的字符或子表达式。例如,“do(es)?”匹配“do”或“does”中的“do”。? 等效于 {0,1}
|
{n}
|
n是非负整数。正好匹配 n 次。例如,“o{2}”与“Bob”中的“o”不匹配,但与“food”中的两个“o”匹配
|
{n,}
|
n是非负整数。至少匹配n次。例如,“o{2,}”不匹配“Bob”中的“o”,而匹配“foooood”中的所有o。'o{1,}' 等效于 'o+'。'o{0,}' 等效于 'o*'
|
{n,m}
|
m和n是非负整数,其中n<=m。至少匹配n次,至多匹配m次。例如,“o{1,3}”匹配“fooooood”中的头三个o。'o{0,1}' 等效于'o?'。注意:您不能将空格插入逗号和数字之间
|
?
|
当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是“非贪心的”。“非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的“贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串“oooo”中,“o+?”只匹配单个“o”,而“o+”匹配所有“o” 匹配除“\n”之外的任何单个字符。若要匹配包括“\n”在内的任意字符,请使用诸如“[\s\S]”之类的模式
|
续表
字 符
|
说 明
|
(pattern)
|
匹配 pattern 并捕获该匹配的子表达式。可以使用 $0...$9 属性从结果“匹配”集合中检索捕获的匹配。若要匹配括号字符 ( ),请使用“\(”或者“\)”
|
(?:pattern)
|
匹配 pattern 但不捕获该匹配的子表达式,即它是一个非捕获匹配,不存储供以后使用的匹配。这对于用“或”字符 (|) 组合模式部件的情况很有用。例如,与“industry|industries”相比,“industr(?:y| ies)”是一个更加经济的表达式
|
(?=pattern)
|
执行正向预测先行搜索的子表达式,该表达式匹配处于匹配 pattern 的字符串的起始点的字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,“Windows (?=95| 98| NT| 2000)”与“Windows 2000”中的“Windows”匹配,但不与“Windows 3.1”中的“Windows”匹配。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后
|
(?!pattern)
|
执行反向预测先行搜索的子表达式,该表达式匹配不处于匹配 pattern 的字符串的起始点的搜索字符串。它是一个非捕获匹配,即不能捕获供以后使用的匹配。例如,“Windows (?!95| 98| NT| 2000)”与“Windows 3.1”中的“Windows”匹配,但不与“Windows 2000”中的“Windows”匹配。预测先行不占用字符,即发生匹配后,下一匹配的搜索紧随上一匹配之后,而不是在组成预测先行的字符后
|
x| y
|
与 x 或 y 匹配。例如,“z| food”与“z”或“food”匹配。“(z| f)ood”与“zood”或“food”匹配
|
[xyz]
|
字符集。匹配包含的任一字符。例如,“[abc]”匹配“plain”中的“a”
|
[^xyz]
|
反向字符集。匹配未包含的任何字符。例如,“[^abc]”匹配“plain”中的“p”
|
[a-z]
|
字符范围。匹配指定范围内的任何字符。例如,“[a-z]”匹配“a”到“z”范围内的任何小写字母
|
[^a-z]
|
反向范围字符。匹配不在指定的范围内的任何字符。例如,“[^a-z]”匹配任何不在“a”到“z”范围内的任何字符
|
\b
|
匹配一个字边界,即字与空格间的位置。例如,“er\b”匹配“never”中的“er”,但不匹配“verb”中的“er”
|
\B
|
非字边界匹配。“er\B”匹配“verb”中的“er”,但不匹配“never”中的“er”
|
\cx
|
匹配由 x 指示的控制字符。例如,\cM 匹配一个 Control-M 或回车符。x 的值必须在 A-Z 或 a-z 之间。如果不是这样,则假定c就是“c”字符本身
|
\d
|
数字字符匹配。等效于 [0-9]
|
\D
|
非数字字符匹配。等效于 [^0-9]
|
\f
|
换页符匹配。等效于 \x0c 和 \cL
|
\n
|
换行符匹配。等效于 \x0a 和 \cJ
|
\r
|
匹配一个回车符。等效于 \x0d 和 \cM
|
\s
|
匹配任何空白字符,包括空格、制表符、换页符等。与 [ \f\n\r\t\v] 等效
|
\S
|
匹配任何非空白字符。等价于 [^ \f\n\r\t\v]
|
\t
|
制表符匹配。与 \x09 和 \cI 等效
|
续表
字 符
|
说 明
|
\v
|
垂直制表符匹配。与 \x0b 和 \cK 等效
|
\w
|
匹配任何字类字符,包括下划线。与“[A-Za-z0-9_]”等效。
|
\W
|
任何非字字符匹配。与“[^A-Za-z0-9_]”等效
|
\xn
|
匹配n,此处的n是一个十六进制转义码。十六进制转义码必须正好是两位数长。例如,“\x41”匹配“A”。“\x041”与“\x04”&“1”等效。允许在正则表达式中使用 ASCII 代码
|
\num
|
匹配 num,此处的 num 是一个正整数。到捕获匹配的反向引用。例如,“(.)\1”匹配两个连续的相同字符
|
\n
|
标识一个八进制转义码或反向引用。如果 \n 前面至少有 n 个捕获子表达式,那么 n 是反向引用。否则,如果 n 是八进制数 (0-7),那么 n 是八进制转义码
|
\nm
|
标识一个八进制转义码或反向引用。如果 \nm 前面至少有 nm 个捕获子表达式,那么 nm 是反向引用。如果 \nm 前面至少有 n 个捕获,那么 n 是反向引用,后面跟 m。如果前面的条件均不存在,那么当 n 和 m 是八进制数 (0-7) 时,\nm 匹配八进制转义码 nm
|
\nml
|
当 n 是八进制数 (0-3),m 和 l 是八进制数 (0-7) 时,匹配八进制转义码 nml
|
\un
|
匹配 n,其中 n 是以四位十六进制数表示的 Unicode 字符。例如,\u00A9 匹配版权符号 (?)
|
使用这些元字符,可以表示具有特定模式的字符串,例如:
/^\s*$/:匹配一个空行。
/\d{2}-\d{5}/:匹配由两位数字、一个连字符再加5位数字组成的ID号。
/<\s* (\S+)(\s[^>]*)?>[\s\S]*<\s*\/\1\s*>/:匹配HTML标记。
像这种以斜杠开始和结尾的字符序列称为正则表达式,在JavaScript中可以很方便地使用这些表达式。
使用RegExp对象执行字符串模式匹配
RegExp是JavaScript中的正则表达式对象,利用它可以完成字符串匹配的各种操作。获得一个RegExp对象可以有两种方式:
var objRegExp=/pattern*/[flag]
//或者
var objRegExp=new RegExp("pattern" [,"flag"]);
其中pattern是要匹配的模式,flag表示搜索模式,有两个可选参数,分别是g和i。g表示全局搜索,在后面介绍的replace方法中非常有用;i表示忽略大小写,默认情况下是大小写敏感的。例如:
/jack/ig
new RegExp("jack","ig");
都表示全局匹配文本中的“jack”单词,并且忽略大小写。
使用这两种创建方式的效果完全一样,可以直接使用。第一种方式甚至不需要引用变量,而直接把正则表达式当作对象来使用,例如:
/jack/ig.test(sourceString);
其中test就是正则表达式对象的一个方法,表7.2列出了正则表达式的所有方法。
表7.2 正则表达式对象RegExp的方法
方 法
|
描 述
|
compile(pattern,flags)
|
将正则表达式转换为内部格式,对于批量匹配可以提高匹配效率
|
exec(str)
|
按照RegExp对象的匹配模式对str字符串进行匹配查找,当设定了全局搜索模式(g),则匹配查找从RegExp对象lastIndex属性所指定的目标字符串位置开始;若没有设置全局搜索,则从目标字符串第一个字符开始搜索。若没有任何匹配发生,返回null。
该方法将匹配结果放在一个数组内返回,该数组有3个属性
input:包含目标字符串,同RegExp.index
index:匹配到的子字符串在目标字符串中的位置,同RegExp.index
lastIndex:匹配到的子字符串后面一个字符的位置,同RegExp.lastIndex
|
test(str)
|
判断str是否符合指定的模式,返回一个布尔变量,true或者false。需要注意,这个方法不会改变RegExp的属性值
|
在执行完字符串匹配后,匹配结果会以RegExp静态属性的方式提供给脚本程序,每次执行exec都会改变这些静态属性,表7.3列出了RegExp对象的静态属性。
表7.3 正则表达式对象RegExp的静态属性
静 态 属 性
|
描 述
|
RegExp.input
|
保存被搜索的字符串
|
RegExp.index
|
保存匹配的首字符的位置
|
RegExp.lastIndex
|
保存匹配的字符串下一个字符的位置
|
RegExp.lastMatch
|
保存匹配到的字符串
|
RegExp.lastParen
|
保存最后一个被匹配的字符串(最后一个括号的内容)
|
RegExp.leftContext
|
保存匹配字符串左边的内容
|
RegExp.rightContext
|
保存匹配字符串右边的内容
|
RegExp.$1~$9
|
保存最开始的9个子匹配(括号中的内容)
|
由此可见,所有的匹配结果都保存在同一个位置,当执行exec方法后,这些静态属性就会改变。因此,必须确保在执行完匹配后立即去使用匹配结果,或将它们保存到另外的变量中,而不再使用RegExp的这些属性。
提取子字符串
在匹配模式中,可以用小括号将子模式括起来,以获取子匹配的内容,这些匹配的结果被存储在RegExp.$1~RegExp.$9中。例如,对于xml片断:
<author></author>jack
如果要使用正则表达式获取其中的作者:jack,可以这样实现:
<script language="JavaScript" type="text/javascript">
<!---->
</script>
当需要提取多个子模式时,可以使用RegExp.$1~RegExp.$9依次获取得到的子字符串。如果需要得到的子模式不只9个,也可以使用exec返回的数组来获取子字符串。返回数组的长度为子模式的个数加1,其中数组索引为0的元素表示被搜索的字符串,其后的元素依次对应于模式中的括号。例如上面的例子也可以用下面的代码实现:
<script language="JavaScript" type="text/javascript">
<!---->
</script>
和字符串相关的操作
在前面讲字符串相关的操作时,有3个方法的参数需要用到正则表达式,下面给出它们的具体用法。
1.string.search(regularExpression)
其中string是要处理的字符串,regularExpression是匹配模式。该方法在string中查找指定的模式,如果找到,则返回它的第一个字符的索引位置,否则返回-1。例如:
<script language="JavaScript" type="text/javascript">
<!---->
</script>
这段代码的最后结果显示为8。和indexOf方法不同,该方法接收的是一个正则表达式,而indexOf只能接收一个字符串。但两者的行为是类似的。
2.string.replace(regularExpression,replaceString)
其中regularExpression是要查找的模式,replaceString是要替换匹配模式的字符串。regularExpression也可以用普通字符串,但那样只能替换第一个出现的匹配,之后的匹配则被忽略。使用正则表达式后可以使用全局模式来实现整个替换。替换后原有字符串不发生变化,而是返回一个新的字符串。例如:在实际开发中经常要删除一段文本中的HTML标记,以获取纯文本,可以使用如下代码实现。
<script language="JavaScript" type="text/javascript">
<!---->
</script>
最后,将得到去掉Html标记后的文本“jack”。
3.string.match(regularExpression)
该方法根据regularExpression正则表达式模式查找字符串string中的匹配字符项,将结果以数组形式返回。该数组有3个属性值,与exec方法返回的数组属性相同。若没有任何匹配,返回null。
注意:若regularExpression对象未设定全局匹配模式,则数组索引为0的元素就是匹配的整体内容,索引为1~9的元素则包含了子匹配得到的字符。若设定了全局模式,则数组包含了搜索到的所有整体匹配项。
分享到:
相关推荐
Java正则表达式介绍和练习Java正则表达式介绍和练习Java正则表达式介绍和练习
以下是对MSDN中关于正则表达式介绍的深入解析。 #### 正则表达式的概念与用途 正则表达式本质上是一种模式匹配工具,它可以识别和处理文本中符合特定规则的模式。与传统的字符串搜索不同,正则表达式提供了一种...
Java使用正则表达式提取XML节点内容的方法示例主要介绍了Java使用正则表达式提取XML节点内容的方法,结合具体实例形式分析了java针对xml格式字符串的正则匹配相关操作技巧。 一、正则表达式简介 正则表达式是指一...
本书主要讲解了正则表达式的特性和流派、匹配原理、优化原则、实用诀窍以及调校措施,并详细介绍了正则表达式在Perl、Java、.NET、PHP中的用法。 本书自第1 版开始着力于教会读者“以正则表达式来思考”,来让读者...
接着,教程介绍了如何使用正则表达式中的数量词来匹配字符出现的次数。比如,`\d`代表一个数字,`0\d\d-\d\d\d\d\d\d\d\d`可以匹配一个以0开头,后面跟着2至3个数字,然后是一个连字符“-”,最后是7至8个数字的电话...
书中介绍的正则表达式涵盖的主题广泛,内容结构清晰,每个章节都配备了丰富的示例和练习,方便读者通过实践来加深理解和记忆。本书不仅适合初学者入门学习,也适合有经验的程序员用以巩固和提高自己的正则表达式技能...
本书《精通正则表达式(第三版)简体中文版》主要介绍了正则表达式的概念、语法以及如何在不同的环境中高效地使用正则表达式。 #### 二、正则表达式的语法基础 1. **元字符**:正则表达式中的特殊字符,用于指定...
正则表达式(Regular Expression,简称regex)是用于匹配字符串的一种模式,广泛应用于文本处理、数据验证、搜索和替换等场景。它通过一系列预定义的字符、符号和运算符来描述一个字符串集,使得程序员可以高效地...
本文将详细介绍"正则表达式调试工具V3.0 绿色免费版"的特点及其在软件开发中的应用。 该调试工具界面简洁,旨在为开发者提供一个友好的环境来调试他们的正则表达式。它的主要功能包括: 1. **模式测试**:用户可以...
### 正则表达式详解 #### 一、正则表达式的定义与背景 正则表达式(Regular Expression),简称regex或regexp,是一种用于描述文本模式的强大工具。它可以帮助我们在文本中进行精确匹配、查找以及替换操作。正则...
本文将详细介绍如何在Java中使用正则表达式以及测试正则表达式的软件。 首先,让我们了解一下Java中的正则表达式基础。在Java中,`java.util.regex`包提供了对正则表达式的支持。主要涉及以下核心类: 1. **...
本文将对正则表达式的基础知识进行详细的介绍,从什么是正则表达式开始,逐步深入浅出地讲解正则表达式的基本概念、正则表达式引擎、文字符号、特殊字符、不可显示字符、正则表达式引擎的内部工作机制等。...
在这个“正则表达式介绍”资源包中,你将找到关于这一主题的详细资料,包括`regular.chm`帮助文档,可能包含了正则表达式的基本语法、常用元字符、匹配规则以及实例解析;`readme.txt`可能是对整个资源包的简要说明...
在IT行业中,XML(eXtensible Markup Language)和正则表达式是两个非常重要的概念,广泛应用于数据处理和文本匹配。本篇文章将深入探讨这两个主题,并结合它们在实际应用中的作用。 首先,XML是一种标记语言,设计...
正物色一本学习正则表达式的入门图书?恭喜,《学习正则表达式》非常适合你!本书提供大量经典简洁的示例,从零开始教你逐步掌握正则表达式。通过匹配特定单词、字符和模式,读者很快就可以自己动手使用正则表达式...
正则表达式是一种强大的文本匹配工具,它能够用来检查、分割、替换字符串,并在很多编程语言和工具中得以应用。正则表达式通常使用简短的字符串来定义复杂的搜索模式,这些模式可以包含普通字符、特殊字符和元字符。...
- **文档**:Python官方文档中的`re`模块介绍,以及其他专门的正则表达式教程。 - **实践项目**:通过实际项目练习,巩固理论知识,提升实战能力。 - **在线工具**:如Regex101、Regexr等网站,提供在线测试和...