0

语境:

我正在改进自定义令牌解析引擎,并希望支持不同语言的字符、数字和空格字符。

目前,这适用于具有以下正则表达式的英文字符和数字

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|'The actual text')}}

4

1 回答 1

0

你应该试试这个:

\{\{someText\(?(\d+)?\|?([^\n\r|]+)?\)?\}\}

如此处所示,在regex101.com

解释 -

根据微软文档

如果指定了符合 ECMAScript 的行为,\w则相当于[a-zA-Z_0-9]

因此,\w自然会匹配任何英文字符,而不是带有口音的字符。

一个好的解决方法是使用[^\n\r|]而不是[\w\d\s%],以便它匹配每个字符,除了换行符和管道|符号(出于显而易见的原因)。

此外,[\s\S]+出于某种原因,您包括了 a ,它基本上匹配每个空格和非空格字符(即,存在的每个字符)。我删除了它,这样你就可以匹配多次出现的模式,即使在新行上:)

于 2019-05-22T19:54:09.140 回答