正则表达式。如何从该字符串中获取多个匹配项?

han*_*luc 5 javascript regex

我正在使用 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)

但它只在第一场比赛时停止。

有没有办法用正则表达式来做到这一点?或者我最好将其作为数组进行迭代?

Wil*_*sem 4

匹配在字符串上迭代,正则表达式仅在上一个匹配结束搜索更多匹配。这保证了进度,因为空字符串可能导致无限循环。

\n\n

但你可以通过如下方式解决这个问题:

\n\n
var 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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该程序的工作原理如下:您不使用修饰符/g,因此只完成了一场比赛。

\n\n
    \n
  1. 每次迭代,您都会尝试将字符串与正则表达式进行匹配。
  2. \n
  3. 如果匹配,您可以确定.index匹配开始的位置并将字符串(包括)删除到该点
  4. \n
  5. 您使用修改后的字符串重复搜索,直到该字符串也无法找到收敛。
  6. \n
\n\n

JSFiddle

\n\n
\n

注意:有一种情况可能会失败:如果空字符串也可以匹配,因为在字符串末尾,它将继续匹配空字符串,并且切割将导致另一个空字符串。然而,实现零长度检查很容易。@Ja\xcd\xa2ck\ 的回答不会出现此问题。

\n
\n\n


\n\n
\n

注意:必须考虑的另一个方面是,这不需要“全局”进展。字符串XXX_1_XXX XXX_2_XXX XXX_3_XXX YYY_1_YYY YYY_3_YYY YYY_2_YYY(注意部分中交换的值YYY_|_YYYY)将给出相同的结果。

\n
\n