问题描述
要在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_pattern
不应用于protected_patterns
数组中定义的任何模式(此概念取自MOSES Tokenizer受保护的模式选项)。
这些受保护的模式可能会或不会在默认模式中定义:
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
结果与预期不符,因此在带有salut comment allez-vous la-la-la
的(法语)文本中举例说明,虽然我整体上获得了有需要的la-la-la
令牌,但我得到了undefined
令牌以及一个la-
:
var combinePatterns = function() {
return new RegExp('(' + [].slice.call(arguments).map(function(e) {
var e = e.toString()
return '(?:' + e.substring(1,"gi")
};
var 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 text.trim().split(patterns);
}
var text = "salut comment allez-vous la-la-la";
var res = tokenize(text,{
protected_patterns: ['\bla([- ]?la)+\b']
})
console.log(res)
我的预期结果应该是
[
"salut","comment"
"allez"
"vous"
"la-la-la"
]
出了什么问题:受保护的模式组合方法或protected_patterns
数组中的正则表达式?
提示:
我注意到,combinePatterns
仅适用于default_pattern
生成了此正则表达式
return this.trim(text.split(/((?:[^a-z0-9äâàéèëêïîöôùüûœç]+))/gi));
会稍微更改默认模式的结果标记:
return this.trim(text.split(/[^a-z0-9äâàéèëêïîöôùüûœç]+/i));
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)