目标中的字符串: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”?
编辑:
我修改了原始字符串
测试an
,and
,that
和's
的效果,a
,this
,the
等。 :
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 __ __ __.
答案 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)