我有一个纯文本,例如Lorem ipsum dolor sit amet
,我想匹配一些标记,例如Lorem
和dolor
,并用诸如<strong>Lorem</strong>
和{ {1}}将包含匹配的单词,即RegEx匹配的结果。
所以我首先写下该函数以匹配相同的表达式:
<i>dolor</i>
其中
function replaceTokens(text, tokens, expr) {
var patterns = [], out;
tokens.forEach(tuple => {
var regex = new RegExp("(" + [tuple].join("[.,;:']?\\s*[.!?]?\\s*") + ")");
var matches = text.match(regex);
if (matches) {
patterns.push(regex);
}
});
var regex = combinePatterns.apply(this, patterns);
out = text.replace(regex, expr);
return out;
}
类似于
function combinePatterns() {
return new RegExp('(' + [].slice.call(arguments).map(function (e) {
var e = e.toString()
return '(?:' + e.substring(1, e.length - 1) + ')'
}).join('|') + ')', "gi")
}
这行得通,就像这里一样:
replaceTokens(text,text.split(/\s+/g),"<strong>$1</strong>")
function replaceTokens(text, tokens, expr) {
var patterns = [],
out;
tokens.forEach(tuple => {
var regex = new RegExp("(" + [tuple].join("[.,;:']?\\s*[.!?]?\\s*") + ")");
var matches = text.match(regex);
if (matches) {
patterns.push(regex);
}
});
var regex = combinePatterns.apply(this, patterns);
out = text.replace(regex, expr);
return out;
}
function combinePatterns() {
return new RegExp('(' + [].slice.call(arguments).map(function(e) {
var e = e.toString()
return '(?:' + e.substring(1, e.length - 1) + ')'
}).join('|') + ')', "gi")
}
var text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."
var rep = replaceTokens(text, ["Lorem", "dolor"], "<strong>$1</strong>")
document.getElementById("in").textContent = text;
document.getElementById("out").innerHTML = rep;
现在,我想为每个令牌应用不同的表达式,所以考虑到它们之间的映射,我想
<div id="in"></div>
<hr>
<div id="out"></div>
function replaceTokens(text, tokens, expressions) {
var patterns = [], out;
tokens.forEach(tuple => {
var regex = new RegExp("(" + [tuple].join("[.,;:']?\\s*[.!?]?\\s*") + ")");
var matches = text.match(regex);
if (matches) {
patterns.push(regex);
}
});
var regex = combinePatterns.apply(this, patterns);
tokens.forEach(tuple => {
out = text.replace(regex, expressions[tuple]);
});
return out;
}
的位置
expressions
它将被命名为
var expressions = {
'Lorem': '<strong>$1</strong>',
'dolor': '<i>$1</i>'
}
发生的是,我只替换了第一个令牌,而没有替换其他令牌。
答案 0 :(得分:2)
尝试使用功能替换您需要的功能。您可能需要设置全局标志。我更改了expressions
对象,使其在编程上更加兼容:
var expressions = {
'Lorem': ['<strong>','</strong>'],
'dolor': ['<i>','</i>']
};
text.replace(regex, function(match, p1) {
return expressions[token].join(p1) });
});
答案 1 :(得分:1)
您只需要将全局标志应用于正则表达式,如下所示:
var regex = new RegExp("(" + [tuple].join("[.,;:']?\\s*[.!?]?\\s*") + ")", "g");
那么您应该获得所有匹配项。
“注意:如果正则表达式不包含g修饰符(以执行全局搜索),则match()方法将仅返回字符串中的第一个匹配项。”