当前位置: 首页>前端>正文

IJjava全局正则 js正则全局匹配

         在常规的JavaScript中我们用到最多的正则表达式操作是RegExp对象的test()方法。

但是此外,RegExp对象的exec()方法、String对象的search()方法、String对象的math()、String对象的replace()方法也是实际工作中极具价值的可选操作。当学习了正则表达式之后,在使用这些方法的时候,最容易给人带来困扰的一个元素就是"全局匹配"。

下面通过几个小例子来对此作出说明。

首先,在JavaScript中创建正则表达式的对象有几种方法。

var reg1 = /([A-Za-z]+)(?=\d+)/

var reg2 =new RegExp(/([A-Za-z]+)(?=\d+)/)

var reg3 = new RegExp("([A-Za-z]+)(?=\\d+)") //在使用字符串构造时,需要注意转义字符\的数量需要加倍。

也可以对已有的RegExp进行重新编译,var a = "([A-Za-z]+)(?!\\d+)";reg1.compile(a)

RegExp对象有一个属性global(只读),布尔类型,这个属性和另一个属性lastIndex(读、写)结合,将影响正则表达式的操作。

首先,建立一个正则表达式对象 var reg1 = /([A-Za-z]+)(?=\d)/g或者var reg1 =new RegExp("([A-Za-z]+)(?=\\d+)","g")这个表达式的意思是:一个以上想大小写字母(后面紧跟至少一个数字)。该reg1设定global为true。

另外建立一个正则表达式对象 该reg2设定global为false。var reg2 = /([A-Za-z]+)(?=\d)/

建立一个字符串,用于测试。var str = "abc12def34gh5kl"

下面将一一解释在开头出现的几种正则表达式应用的方法。

1 RegExp对象的test()方法。

首先使用reg1来测试:


reg1.lastIndex


0


reg1.test(str)


true


reg1.lastIndex


3


reg1.test(str)


true


reg1.lastIndex


8


reg1.test(str)


true


reg1.lastIndex


12


reg1.test(str)


false


reg1.lastIndex


0


......


在设置了参数global的情况下,每次执行test()方法之后,lastIndex值将会改变,下一次执行test()时,将会从lastIndex指定的索引处开始匹配。只有匹配失败时,lastIndex会重新设为0。当然,可以手动设置lastIndex


的值。


然后使用reg2来测试


reg2.lastIndex


0


reg2.test(str)


true


reg2.lastIndex


0


reg2.test(str)


true


可以看到在不设置参数global的情况下,每次执行test()方法之后,lastIndex值始终为0,下一次执行test()时,将会从lastIndex指定的索引处开始匹配。


因此,可以看出在设置了参数global的情况下,使用RegExp对象的test方法,结果会被影响。

2 RegExp对象的exec()方法。

该方法和test方法相似,不同的是返回值。exec的返回值是一个数组。数组的第0个值为本次匹配的结果,第1-n个值为子匹配的结果(正则表达式中小括号中的内容,会作为子匹配提供,如果不希望匹配,可以使用(?:[A-Za-z]+)代替)。


reg1.lastIndex=0


0


reg1.exec(str)


["abc","abc"]


reg1.lastIndex


3


reg1.exec(str)


def", " def "]


reg1.lastIndex


8


reg1.exec(str)


gh", " gh "]


reg1.lastIndex


12


reg1.exec(str)


null


reg1.lastIndex


0


exec方法返回一个数组,该数组用属性index,input分别表示当地匹配结果在字符串中的索引位置、当前字符串。


reg1.lastIndex



0



var arr = reg1.exec(str)



undefined



arr



["abc","abc"]



arr.input



"abc12def34gh5kl"



arr.index



0



arr[0]



"abc"



var arr = reg1.exec(str)



undefined



arr



[" def "," def"]



arr.input



"abc12def34gh5kl"



arr.index



5



arr[0]



"def"


3 String对象的match()方法。

设置参数global的情况下,返回所有匹配结果的数组(不包括字匹配)。未设置参数global的情况下,和RegExp对象的exec方法很像,返回数组的第0个值为本次匹配的结果,第1-n个值为子匹配的结果。


 


str.match(reg1)


[" abc "," def","gh"]


str.match(reg2)


  [" abc "," abc"]


4 String对象的search方法


global的影响。无匹配时返回-1




https://www.xamrdz.com/web/2pn1963445.html

相关文章: