gpt4 book ai didi

javascript - 正则表达式匹配多次

转载 作者:行者123 更新时间:2023-11-29 15:12:30 24 4
gpt4 key购买 nike

我正在尝试匹配一个类型定义

def euro : t1 -> t2 -> t3 (and this pattern my repeat further in other examples)

我想出了这个正则表达式

^def ([^\s]*)\s:\s([^\s]*)(\s->\s[^\s]*)*

但是虽然它匹配 eurot1

  • 然后匹配 -> t2 而不是 t2
  • 无法与 t3 匹配任何内容

我看不出我做错了什么,我的目标是捕捉

euro t1 t2 t3

作为四个独立的项目,我目前得到的是

0: "def euro : t1 -> t2 -> t3"
1: "euro"
2: "t1"
3: " -> t3"

最佳答案

您不能使用 repeated capturing group在 JS 正则表达式中,除了最后一个值之外的所有值都将被“删除”,并在每次后续迭代时重写。

When creating a regular expression that needs a capturing group to grab part of the text matched, a common mistake is to repeat the capturing group instead of capturing a repeated group. The difference is that the repeated capturing group will capture only the last iteration, while a group capturing another group that's repeated will capture all iterations.

出路可以是捕获整个子字符串然后拆分它。这是一个例子:

var s = "def euro : t1 -> t2 -> t3";
var rx = /^def (\S*)\s:\s(\S*)((?:\s->\s\S*)*)/;
var res = [];
var m = s.match(rx);
if (m) {
res = [m[1], m[2]];
for (var s of m[3].split(" -> ").filter(Boolean)) {
res.push(s);
}
}
console.log(res);

图案细节

  • ^ - 字符串的开始
  • def - 文字子串
  • (\S*) - 捕获第 1 组:0+ 个非空白字符
  • \s:\s - : 用单个空格括起来
  • (\S*) - 捕获第 2 组:0+ 个非空白字符
    • ((?:\s->\s\S*)*) - 捕获第 3 组:以下模式序列的 0+ 次重复:
    • \s->\s - 空格,->,空格
    • \S* - 0+ 个非空白字符

关于javascript - 正则表达式匹配多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52867949/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com