我需要找到字符串的所有匹配项:
{{ <text | default('<text or empty space>') }}
所以{{|默认(&#39;&#39;)}}始终存在,例如:
{{ text1 | default('default for text1 value') }}
我需要在同一行中匹配许多这些模式。我正在尝试(参见here)
[\{]{2} (.*) [|]{1} default(.*) [\}]{2}
但它没有得到正确的匹配(只有一个用于2个表达式)。有什么帮助吗?
答案 0 :(得分:1)
请注意.*
部分是贪婪的,并且尽可能多地匹配符号。您可以使用惰性版本.*?
,但还需要g
全局修饰符才能使正则表达式引擎多次匹配。另外,我建议使用正则表达式文字表示法,因为正则表达式是静态的,而不是根据变量构建的。
var reg = /\{{2} (.*?) \| default(.*?) \}{2}/g;
请参阅regex demo
var reg = /\{{2} (.*?) \| default(.*?) \}{2}/g;
var text = "{{ text1 | default('text1 default') }} {{ text2 | default('text2 default') }}"
console.log(text.match(reg));
注意:循环中需要RegExp#exec
才能获取所有捕获的文本。
另一个注意事项:如果您的输入可能在您需要的文字之前有{{ text}}
,.*?
将会贪婪地行动。您需要使用.*?
驯化的贪婪令牌替换所有(?:(?!\}{2}).)*
。请参阅this demo。