上下文:
我正在改进自定义令牌解析引擎,并希望支持不同语言的字符,数字和空格字符。
当前,此功能适用于带有以下正则表达式的英文字符和数字
var pattern = /\{\{someText\(?(\d+)?\|?([\w\d\s%]+)?\)?[\s\S]+\}\}/;
// this will extract the number and text in a token like
'{{someText(20|Hello World)}}'.match(pattern);
//output
[20, 'Hello World']
但是上述正则表达式无法解析其他语言的字符:
'{{someText(20|abcdèfg)}}'.match(pattern);
//output
[20, 'abcd']
我尝试过的正则表达式:
我尝试将XRegexp与下面的正则表达式一起使用,但似乎无法正常工作。
var pattern = XRegExp(/\{\{customText\(?(\d+)?\|?([[\p{L}\p{N}_]\p{Nd}[\p{Z}\h\v]%]+)?\)?[\s\S]+\}\}/);
'{{someText(20|abcdèfg)}}'.match(pattern);
//output
[20, undefined]
对于新引擎,我也希望支持其他语言的字符。这样
中的文本'{{someText(20|abcdèfg)}}'.match(pattern);
将产生输出
[20, abcdèfg]
此令牌的格式始终类似于{{someText(number |'实际文本')}}
答案 0 :(得分:0)
您应该尝试一下:
\{\{someText\(?(\d+)?\|?([^\n\r|]+)?\)?\}\}
如此处所示,位于 regex101.com
根据 Microsoft Docs ,
如果指定了ECMAScript兼容行为,则
\w
等效于[a-zA-Z_0-9]
因此,\w
自然会匹配任何英文字符,而不是带有重音符号的字符。
一个好的解决方法是使用[^\n\r|]
而不是[\w\d\s%]
,以使其与每个字符,除换行符和竖线|
符号匹配(出于明显的原因)。
此外,出于某种原因,您包括了[\s\S]+
,它基本上会匹配每个空格和非空格字符(即存在的每个字符)。我删除了它,以便您可以匹配模式的多次出现,甚至在新行上也可以:)