如何使用XRegexp匹配Javascript中所有语言的文本,数字和空格字符

时间:2019-05-22 19:06:46

标签: javascript regex xregexp

上下文:

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

当前,此功能适用于带有以下正则表达式的英文字符和数字

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 |'实际文本')}}

1 个答案:

答案 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]+,它基本上会匹配每个空格和非空格字符(即存在的每个字符)。我删除了它,以便您可以匹配模式的多次出现,甚至在新行上也可以:)