JavaScript正则表达式在组合正则表达式时添加受保护的模式

JavaScript正则表达式在组合正则表达式时添加受保护的模式,javascript,regex,tokenize,Javascript,Regex,Tokenize,要在JavaScript中组合一个或多个正则表达式模式,我将使用以下函数: Tokenizer.prototype.combinePatterns = function() { return new RegExp('(' + [].slice.call(arguments).map(function (e) { var e = e.toString() return '(?:' + e.substring(1, e.length - 1) + ')' }).joi

要在JavaScript中组合一个或多个正则表达式模式,我将使用以下函数:

Tokenizer.prototype.combinePatterns = function() {
  return new RegExp('(' + [].slice.call(arguments).map(function (e) {
      var e = e.toString()
      return '(?:' + e.substring(1, e.length - 1) + ')'
  }).join('|') + ')', "gi")
};
这个很好用。现在我想“保护”一些模式,这意味着我想在执行生成的正则表达式时排除一些模式。这意味着我希望
default_模式
不应用于
protected_模式
数组中定义的任何模式(此概念取自protected patterns选项)

这些受保护的模式可以在默认模式中定义,也可以不在默认模式中定义:

AggressiveTokenizer.prototype.tokenize = function(text, params = {}) {
    var options = {
        default_pattern: /[^a-z0-9äâàéèëêïîöôùüûœç]+/,
        protected_patterns: []
    };
    for (var attr in params) options[attr] = params[attr];
    var patterns = [].concat(options.protected_patterns).concat(options.default_pattern);
    // LP: pass along all regex patterns as argument
    patterns = this.combinePatterns.apply(this,patterns);
    // break a string up into an array of tokens by anything non-word
    return this.trim(text.split(patterns));

};
按照这种方法,假定要保护某些模式,如

[ '\bla([- ]?la)+\b']
我从
combinePatterns
方法的结果中得到这个组合正则表达式:

/((?:la([- ]?la)+)|(?:[^a-z0-9äâàéèëêïîöôùüûœç]+))/gi
结果并不像预期的那样,因此在(法语)文本中有
sault comment allez vous la la
,当我得到设计的
la la
令牌作为一个整体时,我得到了
未定义的
令牌和
la-

var combinePatterns=function(){
返回新的RegExp('('+[].slice.call(arguments).map(函数(e)){
变量e=e.toString()
返回“(?:”+e.substring(1,e.length-1)+”
}).join(“|”)+“)”,“gi”)
};
var tokenize=函数(文本,参数={}){
变量选项={
默认模式:/[^a-z0-9äèèèèèèèèèèèèèèèè,
受保护的_模式:[]
};
对于(参数中的var attr)选项[attr]=参数[attr];
var patterns=[].concat(options.protected_patterns).concat(options.default_patterns);
//LP:将所有正则表达式模式作为参数传递
patterns=this.combinePatterns.apply(this,patterns);
//将字符串按任何非单词拆分为一个标记数组
返回text.trim().split(模式);
}
var text=“敬礼,请留言”;
var res=标记化(文本{
受保护的_模式:['\bla([-]?la)+\b']
})
console.log(res)
let tokenize=function(str,preserve){
常量分隔符=/[^a-z0-9äèèèèèèèèèèèèèèèè;
//将保留模式的数组转换为一个RegExp:
const screen=new RegExp(“(?:”+preserve.map(s=>”(?:“+s+”))).join(“|”)+”);
//筛选分隔符。不能用分隔符拆分:
常数scr='SSS';
//用于取消筛选的正则表达式:
const scr_regex=new RegExp(scr+'(\\d')+scr);
//初始化保留的子字符串数组:
设屏蔽=[];
返回str
//临时屏幕保留模式:
.更换(屏蔽,s=>scr+(屏蔽。推动-1)+scr)
//拆分为令牌:
.分离(分离器)
//恢复每个令牌中的屏蔽子字符串:
.map(s=>s.replace(scr_regex,(u,i)=>screen[parseInt(i)]);
};
let text=‘敬礼,请留言’;
让res=tokenize(文本,['\\bla(?:[-]?la)+\\b']);

控制台日志(res)>要将某些模式排除到默认模式中,此行不清楚。你的意思是“用默认模式替换每个受保护的模式”@AlexanderMashin抱歉,我的意思是避免
default\u模式
应用于
excluded\u模式
数组中的每个模式。这个概念取自摩西标记器保护模式——您希望结果包含“la la”,但实际上您将该字符串作为分隔符。你的意思是“拉拉”不能分成“拉拉”吗?哦,是的,从你之前的评论中可以明显看出这一点。那么您的方法,即使用默认分隔符对“不可分割”模式进行ORing,从根本上说是错误的。@AlexanderMashin我希望
la la
将作为一个完整的字符串保留。如果我使用
“敬礼评论allez vous la”,匹配(/\bla([-]?la)+\b/g)。这里的问题是如何以正确的方式组合模式和“受保护”模式。