gpt4 book ai didi

javascript - 如何在 JavaScript 中为给定表达式替换文本中的短语

转载 作者:行者123 更新时间:2023-11-30 20:06:43 25 4
gpt4 key购买 nike

我写了这个函数,旨在用给定一组标记的指定表达式expr替换text文档中的单词或短语要匹配。该文档采用换行格式。

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) 对于 words 标记,例如 Loremqui 等,它工作得很好,但我无法摆脱整个标记例如,我不想在像 quis 这样的词中匹配 qui,而是只匹配文本中给定的标记。使用 ^word$ 不适用于捕获组 ^(word)$

[1 - 已解决] 根据第一个答案 new RegExp("\\b("+ word + ")\\b", "gi")

2) 对于 phrases 标记,我使用的正则表达式无法正常工作。我想匹配像 Lorem ipsum dolor sit amet in

这样的确切行
Lorem ipsum dolor sit amet
Lorem ipsum dolor sit amet etwas

它应该只匹配第一行,而不是第二行。

这是一个例子。对于 (1),您可以看到 qui 是如何被捕获为标记并包含在单词 quisaliquip 中的。

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>

已添加 jsfiddle尝试一下。

最佳答案

第一个问题看起来很清楚,将你的 Regex 字符串包装在 '\b'(单词边界)中:

      text = text.replace(new RegExp("\\b(" + word + ")\\b", "gi"), expr);

这应该匹配 'Whole Words only'。

第二个问题,在这里你可以检查,如果它是文本的开头,或者它跟在一个点之后,或者是文本的结尾,或者它后面的一个点,就像这样:

text = text.replace(new RegExp("(^|\\.\\s?|,\\s?)(" + word.replace(/([\(\)'?*!"])/g, "\\$1") + ")($|\\.|,)", "gi"), expr);

想法是它应该匹配SENTENCE,而不是line。一个句子要么从字符串的开头开始,要么在点或逗号之后开始,然后以点、逗号或字符串的结尾结束。

您不应使用“多行”选项。

编辑2:

我已经将我创建的组更改为非捕获组,因此它们不会将组替换网格化。现在是:

text = text.replace(new RegExp("(?:^|\\.\\s?)(" + word.replace(/([\(\)'?*!"])/g, "\\$1") + ")(?:\\.|,|$)", "gi"), expr);

现在它适用于 fiddle .

关于javascript - 如何在 JavaScript 中为给定表达式替换文本中的短语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52840641/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com