我正在使用 JavaScript 正则表达式。假设我有以下字符串:
XXX_1_XXX XXX_2_XXX XXX_3_XXX YYY_1_YYY YYY_2_YYY YYY_3_YYY
Run Code Online (Sandbox Code Playgroud)
我想运行正则表达式并获得以下模式的结果:
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
Run Code Online (Sandbox Code Playgroud)
我尝试过这个的变体:
/(XXX_(.)_XXX)(.)*?(YYY_\2_YYY)/g
Run Code Online (Sandbox Code Playgroud)
但它只在第一场比赛时停止。
有没有办法用正则表达式来做到这一点?或者我最好将其作为数组进行迭代?
匹配在字符串上迭代,正则表达式仅在上一个匹配结束后搜索更多匹配。这保证了进度,因为空字符串可能导致无限循环。
\n\n但你可以通过如下方式解决这个问题:
\n\nvar text = "XXX_1_XXX XXX_2_XXX XXX_3_XXX YYY_1_YYY YYY_2_YYY YYY_3_YYY";\nvar re = /(XXX_(.)_XXX)(.)*?(YYY_\\2_YYY)/;\nwhile((m = re.exec(text)) !== null) {\n alert(JSON.stringify(m));//the result (print)\n //do something with m\n text = text.substring(m.index+1); //this is not the same as /g\n // "/g" would be text = text.substring(m.index+m[0].length+1);\n}\nRun Code Online (Sandbox Code Playgroud)\n\n该程序的工作原理如下:您不使用修饰符/g,因此只完成了一场比赛。
.index匹配开始的位置并将字符串(包括)删除到该点\n\n\n注意:有一种情况可能会失败:如果空字符串也可以匹配,因为在字符串末尾,它将继续匹配空字符串,并且切割将导致另一个空字符串。然而,实现零长度检查很容易。@Ja\xcd\xa2ck\ 的回答不会出现此问题。
\n
\n\n注意:必须考虑的另一个方面是,这不需要“全局”进展。字符串
\nXXX_1_XXX XXX_2_XXX XXX_3_XXX YYY_1_YYY YYY_3_YYY YYY_2_YYY(注意部分中交换的值YYY_|_YYYY)将给出相同的结果。