新物网

当前位置:首页 > 百科

百科

RegExp主体与JS正则匹配的括弧使用等需要注意的问题

时间:2023-10-19 20:01:44 雅雅
创建RegExp对象:常规规则匹配的创建可以立即测量,即斜线 “/” 括下的字符。但在主要参数转换的环境中,RegExp()对象是更好的选择:var reg1 = /'w '/g;var reg2 = new

创建RegExp对象:

常规规则匹配的创建可以立即测量,即斜线 “/” 括下的字符。但在主要参数转换的环境中,RegExp()对象是更好的选择:

var reg1 = /'w '/g;
var reg2 = new RegExp(''\w '','g');

比较两种建立方法,Regexp中的第一个主要参数是首先建立的正则匹配字符串数组。一方面,请注意,没有必要斜线,因为它不会直接显示模式。” / 相反,字符串数组必须冒号“ ‘ “”和转译标记“” 二次转译。

此外,无论是立即量还是RegExp()对象,都形成了新的RegExp目标,并将其取值给自变量。

《Javascript权威指南》一书中提到,针对正则匹配最直接的量,ECMAscript 3要求每次都要回到同一个RegExp目标,所以要用立即量建立的正则匹配来共享一个案例。

《Javascript权威指南》一书中提到,针对正则匹配最直接的量,ECMAscript 3要求每次都要回到同一个Regexp目标,所以要用立即量建立的正则匹配来共享一个案例。直到ECMAScript 5要求每次回到不同类型的案例。

在每个浏览器中,IE始终遵循ECMAScript 根据ECMAScripttt的规定,其他浏览器的旧版本遵循ECMA 三、有关规定。因此,在实际应用中,使用对象建立的方法是安全的,或者在使用lastindex特性时,不要忘记归0。

括弧()的应用:

1、分类

是指独立项组成子关系统一处理,一般用于吗?、 、*、 ,m}等待重复处理。见事例:

var reg = /Java(script)?/;

Script在算式中进行统一处理。

2、往后引入

在正则匹配中选择“” “(n意味着提到的编号)引入式中前括弧中配对的文本。见事例:

var reg = /(d )[a-z]{3}1/; //20man20 //20man23 错 //reg = /1[a-z]{3}(d )/; 错

留意 “ “引入是指前面配对的文本” 20 ",正则匹配而不是匹配” d "。另外,JS只引入前面的匹配文本,比如例子中的匹配文本 将括弧引入前面,将无法获得所有文字,浏览器将提醒错误。另外,JS只引入前面的匹配文本,比如例子中的匹配文本 1.将括弧引入前面,将无法获得所有文本,浏览器将提醒错误。同样,JS也不支持类似的“ (?

exp) 引入命名规范(exp是正则匹配标识符),只支持引入数量。

也就是说,提到了分类和介绍,如果只是想进行分组,但又不想介绍,可以使用 "(?: exp)“方式,既不一致,也不引入序号。见事例:

var reg = /(w{3})(?:d )([a-z]{2})2/; ///man788ababababa

显而易见 2 匹配的是 "ab" 而非 "7788" 。便于分组处理,也加快了检查效率。

3、子匹配算法

有时,如果我们想直接引用实际操作括号匹配的文本,我们可以使用子匹配算法的功效(在权威指南中,称为子匹配算法有点奇怪,事实上,它是通过自变量更换匹配文本)。使用基本形式 ’$n取代配对号为n的文本的方式,常用于String目标中的replace()方式,见例子,相当于号码两侧交换英语单词:

var reg = /(w )=(w )/; var str = ‘love=hate’; str.replace(reg,$2=$1'); //"hate=love"

顺序,贪婪,懒惰:

一般重复配对标识符如何?、 、*、 ,m}在配对过程中,选择贪婪匹配的方式,即尽可能多地获得结论标识符。、 、*、 ,m}在匹配过程中,选择贪婪匹配的方式,即尽可能多地获得结论标识符。相应的是懒惰匹配,即尽可能少的匹配结论,应用程序只需要在反复匹配标识符后添加问题。” ? 可以,比如??、 ?、*?、 ,m}?。见事例:

var str = 'goooogle‘; var reg1 = /o /; //"goooo" var reg2 = /o ?/; //"go"

现在稍微修改一下案例:

var str = 'goooogle‘; var reg1 = /o gle/; //"oooogle" var reg2 = /o ?gle/; //"oooogle"

改过自新后的例子结论变得一样了,为什么? /o ?gle/ 没有得到“没有得到”ogle”呢?在原有的正则匹配中,一直从左到右进行比较,不会从右获得签名串进行比较。

虽然上述结论是相同的,但匹配的基本原理是不同的。第一个oeg1在reg1中 所有的“都会配对”o然后配对“gle然后实现整体配对。但在reg2中,o ?首先会配对一个“”o然后gle在字符串数组中排名第二至第四(即原串”ooo()配对失败。从而回复到o ?匹配第二个“”o“成功后,在第三名和第四名匹配”gle",按此类推...最终获得所有字符串数组。

总的来说,我们应该知道,从优先级到左到右的顺序匹配 > 贪欲 / 懒惰配对。

零宽肯定:

零宽肯定的整体表达可参考博文《正则表达式30分钟入门教程》。值得注意的是,JS只支持零宽优先。即零宽正预测分析优先”(即零宽正预测分析优先”(=exp)“优先考虑零宽负预测分析”(!exp)"。

所谓“零宽”,就是它不占用相匹配的结论符号中的室内空间。比如“w","s根据匹配的字符长度确定,它将占据一个或多个室内空间。但像“^”、“$”这样对应的首末部分,不占用区域,零宽属于这一类。

所说“正 / 负预测分析”是指对满足情况的明确要求。“正”表示需要满足exp,“负”提出不符合exp。

所谓“优先”,是指配对字符串在前面,零宽必须跟随后面。也就是说,串的后部是否符合肯定。

“肯定”是区分的前提。

看两个零宽肯定的例子:

var str = 'java coffeescript'; var reg1 = /bw (?=scriptb)/; //coffee var reg2 = /bw (?!scriptb)/; //java

reg1优先考虑零宽正预测分析=scriptb)“表示英语单词应该是”script最后,它代表了一个不占用所有房间大小的标准。

同样,reg2优先考虑零宽负预测分析!scriptb)“表示不因”“表示不因”“表示不因”script“结尾的单词。

另外,由于没有零宽后顾之忧,无法分辨某个字符串数组的前部达到了什么样的条件。然而,JS可以使用几个正则匹配来实现:首先获得要求的串,然后提取开始到index的字符串,然后匹配串的结尾是否符合所需的肯定标准。主要使用方法可以另外尝试。

match()与exec()的区别:

match和exec是正则匹配字符串的常用方法。两者的功能相似,有一些微小的差异:

1、使用方法

使用match是字符串数组外包装对象的方法:String.match(RegExp);

exec是正则匹配对象的方法,使用方法:RegExp.exec(String);

2、返回结论

当RegExp没有设置全局标志时 "g" 时:

两者的返回结果是一样的。也就是说,当没有匹配值时,回到null,当有匹配值时,回到二维数组(令array)。也就是说,当没有匹配值时,回到null,当有匹配值时,回到二维数组(令array)。array[0]为配对字符串,array[1]、array[2]...与中圆括号正则匹配相匹配的子字符串$1、$2……。与此同时,二维数组具有两个特性,array.index显示了匹配字符串的初始位置,array.input显示已找到的字符串。

当Regexp设置全局标志时 "g" 时:

在值后,match返回二维数组aray。数组的每个项目都显示了获得的所有字符串,因此不再有与圆括号相匹配的子字符串。此时二维数组没有index特性和input特性。

exec和没有全局标志 "g" 表现一样。此时返回是二维数组aray,array[0]是当前配对的字符串,array[1],array[2]..是现阶段配对中圆括号匹配的字符串。此时要注意RegExp对象lastIndex的特性,表示原字符串数组中配对字符串结尾的最后一个位置。lastindex特性置0,没有进一步的匹配结果。因此,所有匹配的字符串都可以通过lastindex能量循环找到。让我们来看看例子:

var str = 'I love1 my job22';
var reg = /b[a-z] (d )b/g;

array = str.match(reg);
//array = “love1”, "job22"    
//array.index = undefind
//array.input = undefined
------------------------------------
array = reg.exec(str);
//array = “love1”, "1"]
//array.index = 2
//array.input = "I love1 my job22"
//reg.lastIndex = 7

//run again
reg.exec(str);
//array = “job22”, "22"]
//array.index = 11
//array.input = "I love1 my job22"
//reg.lastIndex = 16

//run again reg.exec(str); //reg.lastIndex = 0