【发布时间】:2018-10-16 17:07:00
【问题描述】:
我编写了这个函数,目的是用指定的表达式 expr 替换 text 文档中的单词或短语,给定一组要匹配的 tokens。
文档采用换行格式。
function replaceTokens(text, tokens, expr, isline = false) {
tokens.forEach(word => {
if (expr[token]) {
if (isline) { // line regex
text = text.replace(new RegExp("(" + word.replace(/([\(\)'?*!"])/g, "\\$1") + ")", "gi"), expr);
} else {
text = text.replace(new RegExp("(" + word + ")", "gi"), expr[token]);
}
}
});
return text;
}
我面临两个问题。
1) 对于Lorem、qui 等 words 标记,它工作得很好,但我无法摆脱整个标记的情况,即我不想匹配 @987654328 @ 在像 quis 这样的单词中,但只有文本中的给定标记。在这里使用^word$ 不适用于捕获组^(word)$
[1 - SOLVED]根据new RegExp("\\b(" + word + ")\\b", "gi")的第一个答案
2) 对于 phrases 标记,我使用的正则表达式无法正常工作。 我想在
中匹配Lorem ipsum dolor sit amet 这样的确切行
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet etwas
它应该只匹配第一行,而不是第二行。
这是一个例子。对于 (1),您可以看到 qui 是如何被捕获为标记的,并且在单词 quis 或 aliquip 中。
function replaceTokens(text, tokens, expr, isline = false) {
tokens.forEach(word => {
if (isline) { // line regex
text = text.replace(new RegExp("(" + word.replace(/([\(\)'?*!"])/g, "\\$1") + ")", "gi"), expr);
} else {
text = text.replace(new RegExp("\\b(" + word + ")\\b", "gi"), expr);
}
});
return text;
}
text = "Lorem ipsum dolor sit amet,\n consectetur adipiscing elit,\nsed do eiusmod tempor incididunt\nut labore et dolore magna aliqua.\nUt enim ad minim veniam,\nquis nostrud exercitation ullamco laboris nisi\nut aliquip ex ea commodo consequat.\nDuis aute irure dolor in reprehenderit in voluptate velit esse\ncillum dolore eu fugiat nulla pariatur.\nExcepteur sint occaecat cupidatat non proident,\nLorem ipsum dolor sit amet etwas,\nsunt in culpa qui officia deserunt mollit anim id est laborum"
out = replaceTokens(text, ["Lorem", "ut", "qui"], "<strong>$1</strong>", false)
out_phrases = replaceTokens(text, ["Lorem ipsum dolor sit amet", "Duis aute irure dolor in reprehenderit"], "<strong>$1</strong>", true)
document.getElementById("in_text").innerHTML = text.replace(/\n/g, '<br/>')
document.getElementById("out_text").innerHTML = out.replace(/\n/g, '<br/>')
document.getElementById("out_phrases").innerHTML = out_phrases.replace(/\n/g, '<br/>')
<div id="in_text"></div>
<hr>
<div id="out_text"></div>
<hr>
<div id="out_phrases"></div>
已添加jsfiddlesn-p 试用。
【问题讨论】:
-
第二种情况的问题是短语的某些部分可能会进入下一行阻止匹配吗?代码 sn -p 似乎匹配第二种情况没有问题。
-
您的第二个问题不清楚。你想做什么,预期的输出是什么?
-
[\n\s]等于\s -
试试
new RegExp("^(" + word.replace(/([()'?*!"])/g, "\\$1") + ")$", "gim") -
请在您的问题中提供一个小提琴,就像您为第一个问题所做的那样,以便我们查看。
标签: javascript regex