正则表达式的定义

正则表达式的定义

正则表达式(regular expression) 是一个描述字符模式的对象。JavaScript的RegExp类表达式,String和RegExp都定义了方法。正则表达式直接量定义为包含在一对斜杠内间的字符,例如:
//使用直接量定义一个新的RegExp对象
var pattern =/s$/;

//于上边代码等价的正则表达式

var pattern = new RegExp(“s$”);
其中pattern直接量中当程序遇到//会创建JS中(RegExp)正则表达式。
ECMAScript5中RegExp中每次正则运行之后都会返回一个新对象

function getRE(){
    var re =/[a-z]/;
    re.foo="bar";
    return re;
}
var reg=getRE(),
re2 =getRE();
console.log(reg===re2);//在Firefox3.6中返回true,在FireFox 4+中返回false
reg.foo="baz";
console.log(re2.foo);//Firefox 3.6中返回"baz",在Firefox 4+中返回"bar"

js进阶正则表达式括号

方括号:[]指代范围,即在括号中的任意每个字符。
大括号:指代数量。
圆括号:指代选项,抽取子选项,

直接量字符

JavaScript正则表达式也支持非字母的字符匹配,这些字符需要通过反斜杠(\)作为前缀进行转义。
如:\o NUL字符(\u0000),\t 制表符(\u0009),\n 换行符(\u000A) \v 垂直制表符(\u000B)\f 换页符(\u000C)\r回车符(\u000D)\xnn在十六进制数nn指定的拉丁符,例如,\xOA等价于\n \uxxxx由16进制数XXXX指定Unicode字符,例如\u0009等价于\t ,\cX控制字符^X例如,\cJ等价于换行符\n

还有一些特殊标点符号有特殊含义:^ $ . * + ? = ! : |\ / () [] {}

我们不许要记住那些标点读好前都加上反斜线。要进行反斜线本身匹配需要对反斜杠进行“\”。

字符类

将直接量字符单独放进方括号内组成了字符类(character class)。一个字符类可以匹配他所包含的任意字符。

如:/[abc]/就和字母“a”,“b”,"c"中的任意一个都匹配。
^ 符号来否定字符类,他匹配所有不包含在方括号内的字符。

如:/[^abc]/匹配的是除abc以外的所有字符。
匹配拉丁字母表中任何字符和字符,则使用/[a-zA-Z0-9]/

regexp一些特殊的字符类,如:\s表时任何Unicode空白字符。
\S匹配的是非Unicode空白字符

字符:
[…]方括号内的任意字符
[^…]不再方括号的任意字符
. 除换行符和其他Unicode行终止符之外的任意字符
\w 任何ASCII字符组成的单词,等价于[a-zA-Z0-9]
\W 任何ASCII字符组成的单词,等价于[^a-zA-Z0-9]
\s 任何Unicode空白字符
\S 任何非Unicode空白符的字符,注意\w和\S不同
\d 任何ASCII数字,等价于[0-9]
\D 除了ASCII数字之外的任何字符,等价于[^0-9]
[\b] 退格直接量(特例)

重复

表时两位描述符/\d\d/,四位描述成/\d\d\d\d/.可以使用另外一方式来描述多位数字。
字符
{n,m}匹配最少n次,但不能超过m次
{n,}匹配前一项n次或者更多次
{n},匹配前一项n次
? 出现0次或者或1次
+匹配1次或者多次等价于{1,}
匹配0次或者多次{0,}
这里有一些例子
/\d{2,4}/ //匹配2~4个数字
/\w{3}\d?/ //精准匹配第三个单词和一个可选数字
/\s+java\s+/ //匹配前后带一个或多个空格的java
/[^(]
/ //匹配一个或多个非左括号的字符

在使用和?时需要注意和?会匹配到0次。

非贪婪的重复

以上的匹配模式是尽可能多的进行匹配,称之为贪婪式匹配,我们同时可以使用正则表达式进行非贪婪式匹配。进行非贪婪式匹配,只须在待匹配的字符跟随一个问号即可。
如:
/a+?/进行匹配“aaa”,只会匹配到第一个a.

非贪婪式匹配模式所得的期望有时候和期望值不一样
如:/a+?b/进行匹配"aaab"会匹配到真个字符串,因为这个正则表达式的匹配模式总会寻找字符串中第一个可能匹配到的位置。

选择,分组,引用

正则表达式的语法还包括指定选择项,子表达式分组和引用前一子表达式的特殊字符。字符“|”用于分隔供选择的字符。例如/ab|cd|ef/,可以匹配ab,cd,ef。/\d{3}|[a-z]{4}/匹配的是三位数字或者四个小字母。

注意这个表达式是尝试从左到右依次进行匹配,如果匹配到结果则会忽略掉右侧的结果
如:/a|ab/匹配字符串“ab”时,它只能匹配到一个字符。

正则表达式圆括号的使用:一个作用把单独的项组和成子表达式,以便可以处理一个单独的单元那样用“|”,"+","?","*"等来进行单元内的项进行处理。

例如:
1./java(script)?/可以匹配字符串“java”,也可以匹配script.
2./(ab|cd)+|ef/可以匹配字符串“ef”,也可以匹配ab或者cd的一次或多次重复
3.可以在完整模式中定义子模式。当一个正则表达式成功地和目标字符串相匹配时,可以从目标串相匹配时,从目标串中抽出和括号中的子模式向匹配的部分。
如:/[a-z]+\d+/ 匹配字符和数字。(/[a-z]+(\d+)/),则匹配到的数字中进行匹配数字
4.在同一段正则表达式中可以使用\加数字来指代。
如在:/([Jj]ava([Ss]cript)?)\sis(fun\w*)/
中\2中可以指代([Ss]cirpt)。

对于这个不规则表达式的引用,并不是指对子表达式模式的引用,而指的是于那个模式相匹配的文本的引用。

如:/[’"][’"][’"]/,如果匹配左侧和右侧引用可以使用如下引用/([’"])[’"]*\1/
但在中括号内是不能使用引用的:
/([’"])[^\1]\1/ 这种的引用是非法的。

不使用正则表达式的匹配模式

使用?:来进行分组,创建的是不带引用的创建

/(?:[Hh]ello)\s([Ww]orld)/

其中(?:[Hh]ello)不生成引用,而\2可以应用[Ww]world

正则表达式选择,分组,和引用字符
| 选择,匹配的是该符号左边的子表达式或右边的子表达式
(…)组合,将几个项组合为一个单元,这个单元可以通过"*","+","?","|“等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用使用
(?:…)只组合,把项组和在一个单元,但不记忆该组相匹配的字符
\n 和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也可能是嵌套的),组索引是从左到右的左括号数。”(?:"形式的分组不编码。

指定匹配的位置

JS中的锚字符:
^ 匹配字符串的开始,在多行检索中,匹配行的开头
$ 匹配字符的结尾,在多行检索中,匹配一行的结尾
\b 匹配一个单词的边界,简言之,就是字符\w和\W之间的位置,或位于字符\w和字符串的开头或者结尾之间的位置(但需要注意,[\b]匹配的是退格符)
\B 匹配非单词边界的位置
(?=p) 零宽正向先行断言,要求接下来的字符都与p配置,但不能包含匹配p的那些字符
(?!p) 零宽负向先行断言,要求接下来的字符不与p匹配

修饰符

高级匹配模式
访问修饰符:
i,执行不区分的大小写的匹配
g,执行一个全局匹配,简言之,即找到所有的匹配,而不是在找到第一个就停止。
m,多行匹配模式,^匹配第一行的开头和字符串的开头,$匹配行的结束和字符串的结束。

/m的用法

如:
var text1='JavaScript1 JavaScript2 \nJAvaScript3 \nJavaScript4 \nJavaScript5';
console.log(text1);
var text2="JavaScript1"
console.log(text1.match(/^JavaScript\d/g));//输出JavaScript1
console.log(text1.match(/^JavaScript\d/mg));//输出JavaScript1 JavaScript4 JavaScript5
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值