我正在使用 JavaScript 正则表达式。
假设我有以下字符串:
XXX_1_XXX XXX_2_XXX XXX_3_XXX YYY_1_YYY YYY_2_YYY YYY_3_YYY
我想运行正则表达式并获得以下模式的结果:
Match1
1. XXX_1_XXX
2. YYY_1_YYY
Match2
1. XXX_2_XXX
2. YYY_2_YYY
Match3
1. XXX_3_XXX
2. YYY_3_YYY
我尝试过这个的变体:
/(XXX_(.)_XXX)(.)*?(YYY_\2_YYY)/g
但它只在第一场比赛时停止。
有没有办法用正则表达式来做到这一点?或者我最好将其作为数组进行迭代?
匹配在字符串上迭代,正则表达式仅搜索更多匹配after上一场比赛结束。这保证了进度,因为空字符串可能导致无限循环。
但你可以通过如下方式解决这个问题:
var text = "XXX_1_XXX XXX_2_XXX XXX_3_XXX YYY_1_YYY YYY_2_YYY YYY_3_YYY";
var re = /(XXX_(.)_XXX)(.)*?(YYY_\2_YYY)/;
while((m = re.exec(text)) !== null) {
alert(JSON.stringify(m));//the result (print)
//do something with m
text = text.substring(m.index+1); //this is not the same as /g
// "/g" would be text = text.substring(m.index+m[0].length+1);
}
该程序的工作原理如下:不要使用 the /g
修饰符,因此只完成一场比赛。
- 每次迭代,你尝试匹配带有正则表达式的字符串。
- 如果匹配,您确定
.index
匹配开始的地方并将字符串(包括)删除到该点
- 您使用修改后的字符串重复搜索,直到该字符串也无法找到收敛。
JSFiddle http://jsfiddle.net/Kommusoft/5bjqr31t/.
Note:有一种情况可能会失败:如果空字符串也可以匹配,因为在字符串末尾,它将继续匹配空字符串,并且切割将导致另一个空字符串。然而,实现零长度检查很容易。此问题不会出现在@Ja͢ck 的回答 https://stackoverflow.com/a/27886420/67579.
Note:必须考虑的另一个方面是,这不需要“全局”进展。字符串XXX_1_XXX XXX_2_XXX XXX_3_XXX YYY_1_YYY YYY_3_YYY YYY_2_YYY
(注意中的交换值YYY_|_YYYY
部分),将给出相同的结果。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)