正则表达式 - 选择不完全或部分匹配的单词

时间:2017-02-27 05:48:46

标签: regex

目标中的字符串:This is a new pen.

我的目标是使用以下JavaScript代码将上述字符串转换为This is a __ __.

const str = "This is a new pen." 
const newStr = str.replace(/[^this |is |a |an |the |are |.\s]+/ig, ' __ ').trim()

可悲的是,上面使用的正则表达式是错误的,因为它输出This is a ne __ __ en.因为“an”和“the”包含在正则表达式中。

我怎样才能达到目标,仍然在正则表达式中保留“an”和“the”?

编辑:

我修改了原始字符串 测试anandthat's的效果,athisthe等。 :

const str = "This is a new pen and that's an old business book."
const newStr = str.replace(/[^this |is |\'s |and |that |a |an |the |are |.\s]+/ig, ' __ ').trim()   

所以正则表达式现在更长,但仍然存在问题。理想的结果应该是This is a __ __ and that's an __ __ __.

2 个答案:

答案 0 :(得分:3)

对于更通用的解决方案,您需要从一系列关键字中制作正则表达式:

const keywordsList = ["this", "is", "his", ... ];
const pattern = new RegExp("\\b(?!(?:" + keywordsList.join("|") + ")\\b)\\w+", "gi");

const newStr = str.replace(pattern, '__').trim();

它制作了(?!\b(?:word1|word2|word3)\b)\w+形式的正则表达式,它与一个不是指定关键字之一的完整单词匹配。

它可以很好地包装在一个函数中:

function hideWords(input, preservedWords, mask="__") {
    const pattern = new RegExp("\\b(?!(?:" + preservedWords.join("|") + ")\\b)\\w+", "gi");
    return input.replace(pattern, mask);
}

根据您对收缩的要求,它可以开箱即用。由于您似乎永远不想更换它们,只需将收缩的每个部分添加到关键字列表中(我假设您的文本不应该在其他上下文中单独包含这些字母):

hideWords("This's what you'd've done!", ["this", "what", "you", "is", "his", "s", "d", "ve"]);
// This's what you'd've __!

hideWords("This is a new pen and that's an old business book.", ["this", "is", "s", "and", "that", "a", "an", "the", "are"]);
// This is a __ __ and that's an __ __ __.

它目前可以取代部分收缩,但不能替代撇号的全部内容:

hideWords("This'll do.", ["this", "do"]);
//This'__ do.

hideWords("This'll do.", ["do"]);
// __'__ do.

如果这不适合您,您至少需要用包含\w的内容替换正则表达式的'部分并重写字边界。由于我不确定这与您的兴趣有关,我现在不打算研究它。

答案 1 :(得分:2)

使用(?:(?!this |is |his |a |an |the |s |\s|\.).)+修饰符尝试此正则表达式gi

它列出了您想要匹配的单词的所有种类组合(this--> this,his, is,s )

您可以找到演示here

<强>更新

尝试新的正则表达式:

\b(?!this\b|is\b|a\b|and\b|that\b|the\b|\s|an\b|s\b|\').+?(?=\s|\.)

它会排除单词this,is,,a,and,that,the,an,',s并选择所有其他单词。

要排除's我必须再对一个负面的预测并消除它们。

您可以尝试完整的演示here