我正在尝试匹配类型定义
def euro : t1 -> t2 -> t3 (and this pattern my repeat further in other examples)
我想出了这个正则表达式
^def ([^\s]*)\s:\s([^\s]*)(\s->\s[^\s]*)*
但是它与euro
和t1
匹配时
-> t2
而不是t2
t3
匹配任何内容我看不到我在做什么错,我的目标是捕捉
euro t1 t2 t3
作为四个单独的项目,我目前得到的是
0: "def euro : t1 -> t2 -> t3"
1: "euro"
2: "t1"
3: " -> t3"
答案 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);