正则表达式可匹配多次

时间:2018-10-18 06:10:17

标签: javascript regex

我正在尝试匹配类型定义

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"

2 个答案:

答案 0 :(得分:1)

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

  

创建正则表达式需要capturing group来捕获部分匹配的文本时,常见的错误是repeat捕获组而不是捕获重复的组。区别在于重复捕获组将仅捕获最后一次迭代,而捕获另一组重复的组将捕获所有迭代。

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

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 +个非空白字符

答案 1 :(得分:0)

详细信息

  • ?:-创建一个非捕获组
  • $1-接收第一次捕获组的结果,即\w+
  • \s[\:\-\>]+\s-匹配" : "" -> "
  • \w+-匹配重复的字母数字模式
  • let str = 'def euro : t1 -> t2 -> t3';
    let regex = /(?:def\s|\s[\:\-\>]+\s)(\w+)/g;
    
    let match = str.replace(regex, '$1\n').trim().split('\n');
    console.log(match);