JavaScript之正则表达式

一、创建正则对象:    

        JavaScript中的正则表达式与Java类似但又有不同。有两种方法可以创建正则表达式对象:

        1、正则表达式字面量:将正则表达式放在//之间。例如:

var my_regex=/(?:\\.|[^\\\"])*/g;

        2、使用RegExp构造器:该构造器接收一个字符串并将该字符串编译为一个RegExp对象。需要注意的是字符串中的\需要转义为\\,"需要转义为\"。上述正则表达式字面量又可表示为:

var my_regex=new RegExp('\"(?:\\\\.|[^\\\\\\\"])*\"','g');

        其中在1最后有标识g,在2中第2个参数是g。g表示全局的,还可以是其他修饰符,这些修饰符和其对应的含义是:

标识符含义

g(global)

标识该表达式将在输入字符串中查找所有可能的匹配,返回的
结果可以是多个,如果不加g最多只会匹配第一个。
每次调用array.exec()都从lastIndex开始查找新的匹配;
string.match() 则是返回所有的匹配。
string.replace()则替换所有匹配到的字符串。

i(ignoreCase)

标识匹配的时候不区分大小写

m(multiline)

若不指定m,则:^ 只匹配字符串的最开头,$ 匹配字符串的最结尾。
若指定m,则:^ 匹配字符串每一行的开头,$ 在字符串每一行的结尾。

二、正则对象的属性:

        1、静态属性:不需要创建正则对象,直接用RegExp即可访问的属性:

                ①RegExp.input:返回当前要匹配的字符串,也可用RegExp.$_代替;

                ②RegExp.lastMatch:最后一次匹配到的子串结果,需要开启修饰符g,也可用RegExp['$&']代替;

                ③RegExp.lastParen:最后一次分组中捕获到的内容,需要开启修饰符g,也可用RegExp['$+']代替;

                ④RegExp.leftContext:以当前匹配到的子串为上下文,返回之前的子串,也可用RegExp['$&`']代替;

                ⑤RegExp.rightContext:以当前匹配到的子串为上下文,返回之后的子串,也可用RegExp['$\'']代替;

                ⑥RegExp.$n:返回1~9个分组的值。

        2、实例属性:正则对象可访问的属性:

                ①reg.global:表示是否开启全局匹配,是一个只读属性;

                ②reg.ignoreCase:表示是否开启忽略大小写,是一个只读属性;

                ③reg.multiline:表示是否开启多行模式,是一个只读属性;

                ④reg.lastIndex:表示exec下一次匹配的起始索引,只有在全局模式g下才会生效;

                ⑤reg.source:返回当前正则表达式对象的模式文本的字符串,该字符串不会包含正则字面量两边的斜杠以及任何的标志字符。

三、正则对象的方法:

        1、test():用于检测正则在指定的字符串中从lastIndex为0处开始是否具有符合的匹配结果,如果匹配到则返回true,否则返回false。

var regex = /^\d+$/;
//或者
var regex = new RegExp('^\\d+$');

var str = '12345';
var ret = regex.test(str);  //true
var ret = regex.test(str);  //false
var ret = regex.test(str);  //true
regex.lastIndex = 0;
var ret = regex.test(str);  //true

        可以看到如果重复调用test()会出现第一次为true,第二次为false的情况,是因为第一次调用test()之后,lastIndex变为匹配的内容之后的位置(即字符串的末尾),所以第二次就成了false。如果继续调用test(),就会又从lastIndex为0开始。为避免这种情况,可以将lastIndex设置为0再检测。

        2、exec():用于从指定的字符串中返回匹配正则的字符串、各分组匹配的字符串、匹配整个正则的字符串在原字符中的索引位置、原输入字符串以及有名字的分组匹配到的字符串。如果正则表达式没有匹配到结果,那么返回的值就是null。

var str = '2012 google';
var regex = /(?<first>\d{4})\s(\w+)/;
var result = regex.exec(str);
console.log(result); //["2012 google", "2012", "google", index: 0, input: "2012 google", groups: {first: "2012"}]
console.log(result[0]);//"2012 google"
console.log(result[1]);//"2012"
console.log(result[2]);//"google"
console.log(result.index);//0
console.log(result.input);//"2012 google"
console.log(result.groups);//{first: "2012"}

                如果加/g使用全局匹配,每调用一次exec()匹配一次,lastIndex后移,下次再调用exec()时从lastIndex处开始匹配。 

        3、toString():返回一个字符串,其值为该正则对象的字面量形式。

四、支持正则的string的方法:

        1、str.replace(pattern,given)

       根据匹配规则pattern来用指定的内容given去替换str或其部分字符。其中pattern可以是str中的部分字符串也可以是一个正则表达式,given可以是一个字符串,也可以是一个回调函数,该回调函数的入参与正则对象的exec()方法返回的对象中参数相同,该回调函数的返回则是要替换成的内容,例如:

var str = '2016/10/29';
var pattern = /(\d+)(\/)/g;
var data = str.replace(pattern,function(result,$1,$2){
    return $1+'.';
});//"2016.10.29"

       replace方法只会返回原字符被操作后的副本,并不会对原字符串进行改动。

        2、str.match(pattern)

        与正则对象的exec(str)方法相似,返回的内容也相似。用指定的正则匹配字符串后返回匹配正则的字符串、各分组匹配的字符串、匹配整个正则的字符串在原字符中的索引位置、原输入字符串以及有名字的分组匹配到的字符串。如果正则表达式没有匹配到结果,那么返回的值就是null。例如:

var str = '2012 google';
var regex = /(?<first>\d{4})\s(\w+)/;
var result = str.match(regex);
console.log(result); //["2012 google", "2012", "google", index: 0, input: "2012 google", groups: {first: "2012"}]
console.log(result[0]);//"2012 google"
console.log(result[1]);//"2012"
console.log(result[2]);//"google"
console.log(result.index);//0
console.log(result.input);//"2012 google"
console.log(result.groups);//{first: "2012"}

        3、str.split(pattern,length)

        根据正则pattern将字符串拆分为数组,拆分后的数组并不包含作为拆分依据的那个参数。默认情况下是按空字符进行拆分,也就是每个任意的字符作为一个数组元素。pattern参数,可以是正则表达式,也可以是单纯的字符或字符串。length参数,用于设置拆分数组后数组最大的长度(即数组元素的个数),如果不设置length,表示将字符全部拆分为数组。

var str = 'hello world!';
str.split(''); //''空字符(并非空格字符)["h", "e", "l", "l", "o", " ", "w", "o", "r", "l", "d", "!"]
str.split('',5) //["h", "e", "l", "l", "o"]
str.split(/\o/g) //["hell", " w", "rld!"]

        4、str.search(pattern) 

        根据正则pattern在字符串中检索指定的结果,如果检索到则返回该结果首字母在原字符中的索引,否则返回-1。其功能类似于indexOf(),只是indexOf()并不支持正则匹配。

var str = 'hello world!';
str.search('o') //4
str.search('x') //-1

五、一些特殊字符的含义:

字符含义
[\b]匹配一个退格符(backspace)
\0匹配一个null字符,不要在此后面跟小数点。
\cXX是A-Z的一个字母。匹配字符串中的一个控制字符。例如/^cM/匹配字符串中的control-M。
\b字边界标识匹配一个零宽单词边界(zero-width word boundary),如一个字母与一个空格之间。 (不要和 [\b] 混淆)
 例如,/\bno/ 匹配 "at noon" 中的 "no",/ly\b/ 匹配 "possibly yesterday."中的 "ly"。
\B匹配一个零宽非单词边界(zero-width non-word boundary),如两个字母之间或两个空格之间。
例如,/\Bon/ 匹配 "at noon" 中的 "on",/ye\B/ 匹配 "possibly yesterday."=中的 "ye"。
(?:x)非捕获组,只做匹配但不捕获内容,所以会带来微弱的性能优势,不会被编号

其他正则相关资料参考:https://blog.csdn.net/lzghxjt/article/details/72587348《JAVA之正则表达式》中正则的规则约定。

 

参考:Douglas Crockford《JavaScript语言精粹》

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
JavaScript正则表达式和Java正则表达式在语法上有一些差异,但是它们的基本概念和用法是相似的。下面是将JavaScript正则表达式转换为Java正则表达式的一些常见规则: 1. 语法差异: - JavaScript正则表达式使用斜杠(/)作为定界符,而Java正则表达式使用双引号(")作为定界符。 - JavaScript正则表达式中的特殊字符需要进行转义,而Java正则表达式中的特殊字符不需要转义。 2. 字符类: - JavaScript正则表达式中的字符类使用方括号([])表示,而Java正则表达式中使用方括号([])或者Unicode转义(\p{...})表示。 - JavaScript正则表达式中的字符类可以使用连字符(-)表示范围,而Java正则表达式中需要使用Unicode转义(\uXXXX)表示范围。 3. 量词: - JavaScript正则表达式中的量词使用花括号({})表示,而Java正则表达式中使用花括号({})或者问号(?)表示。 - JavaScript正则表达式中的贪婪量词默认是贪婪模式,而Java正则表达式中的贪婪量词需要在后面添加问号(?)来表示非贪婪模式。 4. 边界匹配: - JavaScript正则表达式中的边界匹配使用插入符号(^)和美元符号($)表示,而Java正则表达式中使用\A和\Z表示。 5. 其他差异: - JavaScript正则表达式中的捕获使用圆括号(())表示,而Java正则表达式中使用圆括号(())或者方括号([])表示。 - JavaScript正则表达式中的反向引用使用反斜杠加数字(\1、\2等)表示,而Java正则表达式中使用美元符号加数字($1、$2等)表示。 以上是一些常见的JavaScript正则表达式转换为Java正则表达式的规则。具体转换时,还需要根据具体的正则表达式进行适当的调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值