正则表达式
2015-08-19 09:30
183 查看
特殊的标点
^ $ . * + = ! : | \ / ( ) [ ] { }
此处列有14个;若想在正则表达式中使用这些字符的直接量进行匹配,则必须使用前缀’\’,这是一条通行规则。ps:如果不记得哪些标点符号需要进行转义,可以在每个标点前都加上反斜线。
字符串类
字符 | 含义 |
---|---|
[] | 匹配方括号内的任意字符串 |
[^] | 匹配不在方括号内的任意字符串 |
. | 除换行符和Unicode终止符以外的任意字符 |
\w | 匹配任意ASCII字符组成的字符串,等价于[a-zA-Z] |
\W | 匹配任意非ASCII字符组成的字符串,等价于[^a-zA-Z] |
\s | 匹配任何Unicode空白符 |
\S | 匹配任何非Unicode空白符 |
\d | 匹配任何ASCII数字 |
\D | 匹配任何非ASCII数字 |
[\b] | 退格直接量 |
重复
字符 | 含义 |
---|---|
{n,m} | 匹配前一项至少n次,至多m次 |
{n,} | 匹配前一项至少n次 |
{n} | 匹配前一项n次 |
? | 匹配前一项0次或1次 |
+ | 匹配前一项至少1次 |
* | 匹配前一项0次或多次 |
贪婪模式与非贪婪模式
在默认情况下,上表列出的重复匹配是尽可能多的匹配,即贪婪模式,eg:待匹配字符串”aaa”,使用/a+/则会匹配全部三个字符;若要使用非贪婪模式,则需在待匹配的字符后加一个’?’即可,eg:还是前一个例子,使用/a+?/进行匹配,则只会匹配第一个’a’。针对? + *的非贪婪写法
?? +? *?,{1,5}?等价于{1}。
选择,分组与引用
在正则表达式中,字符’|’用于表示分割供选择的字符。eg:/\d{3}|[a-z]{4}/用于匹配3个数字活着4个小写字母。但是要注意的是,匹配是从左往右的,倘若发现匹配项便会忽略后面的。在政治表达式中()圆括号有多种用途:
a.把单独的项组合成子表达式,以便可以像处理一个独立的单元那样使用。
b.在完整的模式中定义子模式,当一个正则表达式成功和一个字符串进行匹配时,可以从目标串中抽出和圆括号中的子模式相匹配的部分。
c.允许在同一个正则表达式后部引用前面的子表达式,通过在’\’后添加数字来实现,eg:\1表示引用第一个带圆括号的子表达式匹配的文本,注意!是匹配的文本不是表达式。另外,不能在字符类中使用这种引用。
(…)捕获型引用与(?: …)非捕获型引用,使用(?: …)进行分组的表达式不生成引用,即不被’\1’等形式引用。
指定匹配的位置
字符 | 含义 |
---|---|
^ | 匹配字符串的开头,在多行匹配中,匹配一行的开头 |
$ | 匹配字符串的结尾,在多行匹配中,匹配一行的结尾 |
\b | 匹配一个单词的边界 |
\B | 匹配非单词边界的位置 |
(?=p) | 零宽正向先行断言,要求接下来的字符都要与p匹配,但不包括匹配p的那些字符,即仅当子表达式p在此位置的右侧匹配时才继续匹配。例如,/w+(?=/d) 与后跟数字的单词匹配,而不与该数字匹配。此构造不会回溯。 |
(?!p) | 零宽负向先行断言,要求接下来的字符都不与p匹配,即仅当子表达式p不在此位置的右侧匹配时才继续匹配。例如,/w+(?!/d) 与后不跟数字的单词匹配,而不与该数字匹配 |
(?<=p) | 零宽度正后发断言。仅当子表达式p在 此位置的左侧匹配时才继续匹配。例如,(?<=19)99 与跟19后面的99的实例匹配。此构造不会回溯。 |
(?<!p) | 零宽度负后发断言。仅当子表达式p不在此位置的左侧匹配时才继续匹配。例如,(?<!19)99 与不跟在 19 后面的 99 的实例匹配 |
$1、$2、...、$99 | 与 regexp 中的第1到第99个子表达式相匹配的文本 |
$& | 与 regexp 相匹配的子串 |
$` | 位于匹配子串左侧的文本 |
$’ | 位于匹配子串右侧的文本 |
修饰符
字符 | 含义 |
---|---|
i | 不区分大小写 |
g | 全局匹配,即找到所有的匹配 |
m | 多行匹配,^匹配一行和字符串的开头,$匹配一行和字符串的结尾 |
用于模式匹配的String方法
方法 | 示例 | 含义 |
---|---|---|
search() | 'JavaScript'.search(/script/i) | search的参数为一个正则表达式,若匹配成功则返回第一个与之匹配的子串的起始位置,若没有找到,则返回-1。该方法不支持全局搜索,即会忽略g标示。如果参数不为正则表达式,则会通过RegExp()构造函数转换。 |
replace() | text.replace(/javascript/gi, 'JavaScript') | replace()方法用以执行检索和替换操作,第一个参数为正则表达式,第二个为用于替换的字符串。如果第一个参数是一个字符串而不是一个正则表达式,则replace()会搜索该字符串,只搜索不转换。这只是replace()的简单用法,举个例子来说它的另一个用法:var quote = /"([^"]*)"/g; text.replace(quote, '“$1”')此例为用中文的双引号替换掉英文的双引号,但保持中间的内容不变,首先,看 quote,它匹配的是一串被”“包裹的字符串(字符串的中间不能含有”),再看 $1,它的作用是存储前面quote中()里所匹配的字符串(这里的()即表示捕获型匹配),其他关于$的用法后面补充;另外,replace()的第二个参数可以是一个函数,该函数能够动态地计算替换的字符串 |
match() | '1 plus 2 equals 3'.match(/\d+/g) | match()是最常用的String正则表达式方法,它的唯一参数就是一个正则表达式,返回由一个由匹配结果组成的数组(如果没有设置全局搜索g,它只检索第一个匹配,但依然返回一个数组) |
split() | '12,34,56'.split(',')//返回[‘12’, ‘34’, ‘56’] | 该方法接受一个参数用作分隔符,然后将调用它的字符串拆分为以该分隔符作分割切点的子串,然后返回由这些子串组成的数组 |
RegExp对象
先啰嗦一下,以/…/创建的正则表达式对象的形式叫做正则表达式字面量,类似于var obj = {};这种理利用对象字面量创建对象的形式一样,而RegExp()则是创建正则表达式字面量的构造函数,类似通过构造函数创建对象一样。正则表达式是通过RegExp对象表示的,除了RegExp()构造函数外,RegExp对象还支持三个方法和一些属性。
RegExp()接受两个参数,第一个必须,包含正则表达式的主体部分,也就是正则表达式直接量中两条斜线之间的部分;无论是字符串直接量还是正则表达式,都使用’\’作为转义字符的前缀,即’\’要变成’\’。第二个参数可选,为
i,g,m'或者他们的组合。
RegExp的属性
属性 | 含义 |
---|---|
source | 只读,包含正则表达式的文本 |
global | 只读的布尔值,用以说明是否有全局的g标示 |
ignoreCase | 只读的布尔值,用以说明是否有忽略大小写的i标示 |
multiline | 只读的布尔值,用以说明是否有多行匹配的m标示 |
lastIndex | 可读可写的整数,如果匹配模式带有全局g修饰符,这个属性存储在整个字符串下一次检索开始的位置,这个属性会被exec()和test()用到 |
RegExp的方法
方法 | 说明 |
---|---|
exec() | 该方法对接受一个字符串作为参数,并对其执行匹配检索,如果找到匹配就返回一个数组,若没找到则返回null;属性index包含发生匹配的字符串的位置,属性input引用的是正在检索的字符串,lastindex为pattern的属性 |
test() | 该方法的参数为一个字符串,若有匹配,则返回true |
var pattern = /Java/g; var text = "JavaScript is more fun than Java!"; var result; result = pattern.exec(text); console.log(result) while((result = pattern.exec(text)) != null) { console.log("Matched '" + result[0] + "' " + "at position:" + result.index + ";next search begins at:" + pattern.lastIndex); console.log(pattern.lastIndex); }
输出:
["Java", index: 0, input: "JavaScript is more fun than Java!"] 4 ["Java", index: 28, input: "JavaScript is more fun than Java!"] 32
String的那几个方法并不会用到lastIndex属性,它们只是简单的将lastIndex重置为0;如果让一个带有g修饰的正则表达式对多个字符串执行exec()和test(),要么在每个字符串中找到所有匹配以便将lastIndex重置为0,要么显式的手动设置为0,否则,在下一次对新字符串进行检索时,开始检索的位置为上一次的lastIndex。如果不带g,则不用担心。另外,在ES5中,正则表达式直接量的每次计算都会创建一个新的RegExp对象,每个新的RegExp对象具有各自的lastIndex属性,这样大大减少残留lastIndex造成的意外影响。
注意事项
-正则表达式必须写在一行中相关文章推荐
- 递归思想
- 如何使用Google APIs和Google应用系统集成(7)----在里面JSON兑换XML数据处理,JSON数据包括违规XML数据规范:XML节点名称不支持号码Java解
- GUID
- 数据库增删改查例子
- exp,imp导入时用户名密码错误
- ORA-0131:Insufficient privileges
- MyBatis教程之开发环境搭建和以接口的方式编程
- 递推思想
- 内部类创建一个内部版本
- 电子商务网站的设计与实现(四):项目名称malling和一期开发计划
- HDU4815
- Corporate Identity - HDU 2328(多串求共同子串)
- Toolbar的各种使用方法
- 根据与目标距离排序
- 动态规划_拦截导弹
- OverFeat Integrated Recognition, Localization and Detection using Convolutional Networks
- android 源码在线
- Hadoop导航:版本、生态圈及MapReduce模型
- C#精髓 第四讲 GridView 72般绝技
- MAVEN环境变量配置