Как сопоставить текст, цифры и символы пробела для всех языков в Javascript, используя XRegexp - PullRequest
0 голосов
/ 22 мая 2019

Контекст:

Я улучшаю пользовательский механизм синтаксического анализа токена и хочу поддерживать символы, цифры и пробелы на разных языках.

В настоящее время это работает с английскими символами и числами сследующее регулярное выражение

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 голосов
/ 22 мая 2019

Вы должны попробовать это:

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

Как видно здесь, на regex101.com

Объяснение -

Согласно Документам Microsoft ,

Если указано поведение, совместимое с ECMAScript, \w эквивалентно [a-zA-Z_0-9]

Итак, \w будет естественно соответствовать любому английскому символу, а не символу с акцентом.

Хороший обходной путь - использовать [^\n\r|] вместо [\w\d\s%], чтобы он совпадал с каждым символом, ЗА ИСКЛЮЧЕНИЕМ новой строки и символом | канала (по очевидным причинам).

Кроме того, по какой-то причине вы включили [\s\S]+, который в основном соответствовал бы каждому пробелу и непробельному символу (то есть каждому существующему символу). Я удалил это, чтобы вы могли сопоставить несколько вхождений шаблона, даже в новых строках:)

...