带有占位符的JavaScript字符串标记化正则表达式



我有一个标记化器函数,它接受一个字符串、split的正则表达式模式和一个要保护的正则表达式图案的任意列表,以避免标记化。为了实现这一点,我使用占位符____SSS____来避免这些模式被拆分:

function tokenize(str,default_pattern,protected_patterns) {
const screen = new RegExp('(?:' + protected_patterns.map(s => '(?:' + s + ')').join('|') + ')', "gi");
var screened = [];
str = str.replace(screen, s => {
var i = screened.push(s) - 1;
return '____SSS____' + i + '____SSS____'; // chose a non-separator as screener, so that these placeholders don't get split.
});
res = str.split(default_pattern).map(s => s.replace(/____SSS____(d+)____SSS____/, (_, i) => screened[i]))
return res;
}

例如,如果我想防止模式yo-ho被拆分,我会这样做:

tokenize("Podia ser yo-ho, mi amor ahora ya acabó", /[^a-zA-Zá-úÁ-ÚñÑüÜ____SSS____(d+)____SSS____]+/i, ["\byo-ho\b"])
(8) ["Podia", "ser", "yo-ho", "mi", "amor", "ahora", "ya", "acabó"]

当然,我必须在正则表达式中添加占位符格式____SSS____(d+)____SSS___,否则会发生拆分:

patterns("Podia ser yo-ho, mi amor ahora ya acabó", /[^a-zA-Zá-úÁ-ÚñÑüÜ]+/i, ["\byo-ho\b"])
(9) ["Podia", "ser", "SSS", "SSS", "mi", "amor", "ahora", "ya", "acabó"]

现在,对于不同的语言,我可能有不同的分割规则,比如

{
"es" : /[^a-zA-Zá-úÁ-ÚñÑüÜ]+/,
"fr" : /[^a-z0-9äâàéèëêïîöôùüûœç]+/i
}

我想动态地将____SSS____(d+)____SSS___添加到它们中的每一个,但我找不到正确的方法来获得它,所以结果应该是:

{
"es" : /[^a-zA-Zá-úÁ-ÚñÑüÜ____SSS____(d+)____SSS___]+/,
"fr" :  /[^a-z0-9äâàéèëêïîöôùüûœç____SSS____(d+)____SSS___]+/i
}

这将使具有受保护图案的CCD_ 6正常工作。

您可以简单地捕获现有的拆分规则,如下所示:
(.+)(].*)
并将占位符附加在第一个和第二个捕获组之间。

https://regex101.com/r/QCFnLS/1

最新更新