欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

JS test()方法:检测一个字符串是否匹配某个正则表达式 全局匹配 有大用 有大大用

JavaScript  正则表达式中的 test() 方法用来检测一个字符串是否匹配某个正则表达式

test() 方法的具体格式如下:

regexp.test(string)

regexp 表示正则表达式对象,参数 string 表示要检测的字符串。如果字符串 string 中含有与 regexp 正则表达式匹配的文本,则返回 true;否则返回 false。

示例1

在下面示例中,使用 test() 方法检测字符串中是否包含字符。

  1. var s = "JavaScript";

  2. var r = /\w/g;

  3. var b = r.test(s);

   

同样使用下面正则表达式也能够进行匹配,并返回true。

  1. var r = /JavaScript/g;

  2. var b = r.test(s);

   

但是如果使用下面这个正则表达式进行匹配,就会返回 false,因为在字符串“JavaScript”中找不到对应的匹配。

  1. var r = /\d/g;

  2. var b = r.test(s);

   

在全局模式下,test() 等价于 exec() 方法。配合循环语句,它们都能够迭代字符串,执行全局匹配操作,test() 返回布尔值,exec() 返回数组或者 null。虽然 test() 方法的返回值是布尔值,但是通过正则表达式对象的属性和 RegExp 静态属性,依然可以获取到每次迭代操作的匹配信息。

示例2

针对上面示例,下面使用 test() 方法代替 exec() 方法可以实现相同的设计效果。

  1. var s = "JavaScript";  //测试字符串

  2. var r = /\w/g;  //匹配模式

  3. while(r.test(s)) {  //循环执行匹配检测,如果true,则继续验证

  4. console.log("匹配文本 = " + RegExp.lastMatch + " r.lastIndex = " + r.lastIndex);

  5. //利用RegExp静态属性显示当前匹配的信息

  6. }

   

RegExp.lastMatch 记录了每次匹配的文本,正则表达式对象的 lastIndex 属性记录下一次匹配的起始位置。

使用 test() 执行匹配时,IE 支持 RegExp.index 记录了匹配文本的起始下标位置、Regexp.lastIndex 记录下一次匹配的起始位置,但是其他浏览器不支持。

除了正则表达式内置方法外,字符串对象中很多方法也支持正则表达式的模式匹配操作,下面列表比较了字符串对象和正则表达式对象包含的 6 种模式匹配的方法,如表所示。

比较各种模式匹配的方法
方法所属对象参数返回值通用性特殊性
exec()正则表达式字符串匹配结果的数组。如果没有找到,返回值为 null通用强大一次只能匹配一个单元,并提供详细的返回信息
test()正则表达式字符串布尔值,表示是否匹配快速验证一次只能匹配一个单元,返回信息与 exec() 方法基本相似
search()字符串正则表达式匹配起始位置。如果没有找到任何匹配的字符串,则返回 -1简单字符定位不执行全局匹配,将忽略标志 g,也会忽略正则表达式的 lastIndex 属性
match()字符串正则表达式匹配的数组,或者匹配信息的数组常用字符匹配方法将根据全局模式的标志 g 决定匹配操作的行为
replace()字符串正则表达式或替换文本返回替换后的新字符串匹配替换操作可以支持替换函数,同时可以获取更多匹配信息
split()字符串正则表达式或分割字符返回数组特殊用途把字符串分隔为字符串数组



来自 http://c.biancheng.net/view/5619.html




Javascript 正则表达式之全局匹配


         在常规的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://blog.csdn.net/xvxingan/article/details/9251659            


           



       

JS正则表达式修饰符为全局匹配(global)时,连续使用test()方法测试,结果不一致

      

JS RegExp中全局匹配(global)中踩过的坑

1、踩坑的代码,及结果

   var str1 = 'I from Hunan';
   var str2 = 'I from Jiangsu';
   var pattern = /I from (Hunan|Jiangsu)/g;
  
   console.log(pattern.test(str1));//结果为true
  
   console.log(pattern.test(str2));//预计结果为true,实际false

    我写这段代码出现这样结果不一致的原因是对lastIndex属性的了解不到位。

2、JavaScript lastIndex 属性

        该属性存放一个整数,它声明的是上一次匹配文本之后的第一个字符的位置。上次匹配的结果是由方法 RegExp.exec() 和 RegExp.test() 找到的,它们都以 lastIndex 属性所指的位置作为下次检索的起始点。这样,就可以通过反复调用这两个方法来遍历一个字符串中的所有匹配文本。
该属性是可读可写的。只要目标字符串的下一次搜索开始,就可以对它进行设置。当方法 exec() 或 test() 再也找不到可以匹配的文本时,它们会自动把 lastIndex 属性重置为 0。

3、再次了解了lastIndex属性后,测试lastIndex属性:

var str1 = 'I from Hunan';
var str2 = 'I from Jiangsu';
var pattern = /I from (Hunan|Jiangsu)/g;

console.log(pattern.lastIndex);//0,起始检索下标为0
console.log(pattern.test(str1));//结果为:true
console.log(pattern.lastIndex);//12

/*结果为false时,lastIndex 下次检索的起点重置为0*/
console.log(pattern.test(str2));//结果为:false
console.log(pattern.lastIndex);//0
/*再次test(str2),结果是true,*/
console.log(pattern.test(str2));//结果为:true
console.log(pattern.lastIndex);//14


4、解决方案

    还是使用全局匹配:

var str1 = 'I from Hunan';
var str2 = 'I from Jiangsu';
var pattern = /I from (Hunan|Jiangsu)/g;

console.log(pattern.test(str1));//true

pattern.lastIndex = 0;

console.log(pattern.test(str2));//true

    不使用全局匹配:

var str1 = 'I from Hunan';
var str2 = 'I from Jiangsu';
var pattern = /I from (Hunan|Jiangsu)/;

console.log(pattern.test(str1));//true

console.log(pattern.test(str2));//true

               

来自  https://blog.csdn.net/qq_43313914/article/details/105770608


普通分类: