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
。