Javascript 正则表达式要匹配多次

Javascript 正则表达式要匹配多次,javascript,regex,Javascript,Regex,我正在尝试匹配类型定义 def euro : t1 -> t2 -> t3 (and this pattern my repeat further in other examples) 我想出了这个正则表达式 ^def ([^\s]*)\s:\s([^\s]*)(\s->\s[^\s]*)* 但是当它与欧元和t1相匹配时 然后匹配->t2而不是t2 无法将任何内容与t3 我看不出我做错了什么,我的目标是抓住机会 euro t1 t2 t3 作为四个独立的项目,我目前得

我正在尝试匹配类型定义

def euro : t1 -> t2 -> t3 (and this pattern my repeat further in other examples)
我想出了这个正则表达式

^def ([^\s]*)\s:\s([^\s]*)(\s->\s[^\s]*)*
但是当它与欧元和t1相匹配时

  • 然后匹配
    ->t2
    而不是
    t2
  • 无法将任何内容与
    t3
我看不出我做错了什么,我的目标是抓住机会

euro t1 t2 t3
作为四个独立的项目,我目前得到的是

0: "def euro : t1 -> t2 -> t3"
1: "euro"
2: "t1"
3: " -> t3"
您不能在JS正则表达式中使用,除了最后的值之外,所有值都将被“删除”,并在每次后续迭代中重新写入

当创建一个正则表达式时,它需要捕获匹配文本的一部分,一个常见的错误是捕获组,而不是捕获重复的组。不同之处在于,重复捕获组将只捕获最后一次迭代,而捕获另一个重复组的组将捕获所有迭代

解决方法可以是捕获整个子字符串,然后将其拆分。以下是一个例子:

var s=“def euro:t1->t2->t3”;
var rx=/^def(\S*)\S:\S(\S*)((?:\S->\S\S*)*)/;
var-res=[];
var m=s.匹配(rx);
如果(m){
res=[m[1],m[2]];
对于(m[3]的变量s)。拆分(“->”)。筛选器(布尔)){
恢复推力;
}
}

控制台日志(res)详细信息

  • ?:
    -创建非捕获组
  • $1
    -接收第一个捕获组的结果,即
    \w+
  • \s[\:\-\>]+\s
    -匹配
    :“
    ”->“
  • \w+
    -匹配重复的字母数字模式
  • let str='def euro:t1->t2->t3';
    设正则表达式=/(?:def\s |\s[\:\-\>]+\s)(\w+)/g;
    让match=str.replace(正则表达式,$1\n').trim().split('\n');
    
    控制台日志(匹配)
    正则表达式匹配整个字符串,其中包括子字符串
    t2
    ,以及子字符串
    ->t2
    ?你想把
    t2
    放在它自己的捕获组中吗?@SimonH这是一个问题。它只用于对模式进行分组,因此不需要捕获构造开销。您不应该使用
    [\w\d]+
    ,因为
    \w+
    将完成相同的工作<代码>\w
    匹配ASCII字母、数字或
    \uu