当前位置: 首页 > 面试题库 >

如何在JavaScript Regexp中捕获任意数量的组?

祁星阑
2023-03-14
问题内容

我希望这行JavaScript:

"foo bar baz".match(/^(\s*\w+)+$/)

返回类似:

["foo bar baz", "foo", " bar", " baz"]

但相反,它仅返回最后捕获的匹配项:

["foo bar baz", " baz"]

有没有办法获取所有捕获的比赛?


问题答案:

在大多数情况下,当您重复一个捕获组时,仅保留最后一个捕获。以前的任何捕获都将被覆盖。以某种形式,例如.NET,您可以获取所有中间捕获,但是Javascript并非如此。

也就是说,在Javascript中,如果您有一个带有 N个 捕获组的模式,则即使重复了其中一些捕获组,每次匹配也只能捕获正好 N个 字符串。

因此,一般而言,取决于您需要执行的操作:

  • 如果可以选择,请使用分隔符代替
  • 不是匹配/(pattern)+/,而是匹配,也许/pattern/gexec循环
    • 请注意,这两者并不完全相同,但可以选择
  • 进行多级匹配:
    • 在一场比赛中捕获重复的组
    • 然后运行另一个正则表达式以打破匹配

这是一个<some;words;here>使用exec循环匹配文本,然后分割;成单个单词的示例:

var text = "a;b;<c;d;e;f>;g;h;i;<no no no>;j;k;<xx;yy;zz>";

var r = /<(\w+(;\w+)*)>/g;

var match;
while ((match = r.exec(text)) != null) {
  print(match[1].split(";"));
}
// c,d,e,f
// xx,yy,zz

使用的模式是:

      _2__
     /    \
<(\w+(;\w+)*)>
 \__________/
      1

该场比赛<word><word;another><word;another;please>,等2组重复捕捉到任何数量的话,但它只能保存最近捕获。整个单词列表由组1捕获;然后split,此字符串位于分号分隔符上。



 类似资料:
  • 问题内容: 我有一个元组列表: 该列表可以是任意长度,元组也可以。我想按它们出现的顺序将其转换成元素的列表或元组: 如果在开发时知道我会得到多少个元组,我可以添加它们: 但是由于直到运行时我才知道会有多少个元组,所以我无法做到这一点。我觉得有一种方法可以使用,但我无法弄清楚。我可以遍历元组并将其添加到累加器中,但是那样会创建很多永远不会使用的中间元组。我还可以遍历元组,然后遍历元组的元素,并将它们

  • 我通过安装从FastAPI提供React应用程序 通过这个 React 应用程序得到服务,React 路由在客户端也能正常工作,但是一旦客户端重新加载未在服务器上定义但在 React 应用程序中使用的路由 FastAPI 来解决此问题,我做了如下操作。 < Li > < code > @ app . route('/network ') < Li > < code > @ app . route(

  • 问题内容: 我有一个简单的Flask路由,我想捕获文件的路径。如果我在规则中使用它,则适用于,但无效。如何捕获任意路径,以便将其传递给视图函数? 问题答案: 使用path转换器捕获任意长度的路径:将捕获路径并将其传递给参数。默认转换器捕获单个字符串,但以斜杠停止,这就是为什么第一个URL匹配而第二个URL不匹配的原因。 如果你还想匹配根目录(斜杠和空路径),则可以添加另一个规则,该规则为path参

  • 本文向大家介绍如何在Clojurescript中捕获任何JavaScript异常?,包括了如何在Clojurescript中捕获任何JavaScript异常?的使用技巧和注意事项,需要的朋友参考一下 要在Clojurescript中捕获JavaScript异常,请尝试以下代码片段-

  • 我想创建一个方法,它可以具有任意数量的参数和任何数据类型的任何方法。 为。我想动态调用以下所有方法void method1(int x,int y)void method2(int x,String y)void method3(Float x,Long y,String z) 我正在使用反射来这样做。现在我讨论了如何在调用这个动态方法的过程中向这些方法传递参数。我做了多远... 如何调用MyMe

  • 我使用的是python 2.7和tornado 4.5 以下代码不起作用:除块不被触发。我不明白为什么? 相反,我可以捕获;但是我没有我如何调用的上下文。在我的例子中,更有意义的是引发一个较低级别的异常,并且调用者根据输入将其转换为人类可读的错误。 我是否只需要重构它来调用较低级别的gen.Task?那会很烦人:/