2017-02-27 71 views
2

在目標串詞:This is a new pen.正則表達式 - 選擇不完全或部分匹配

我的目標是把上面的字符串到This is a __ __.用JavaScript這樣的:

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 __ __ __.

+0

這個正則表達式並沒有做你期望的。方括號構成一個字符集;集合內字符的排序無關緊要。 – jasonharper

+0

@jasonharper我真的不擅長正則表達式。添加方括號是爲了顯示'^'**的效果,而不是**選擇。 – sijane

+0

@sijane我已經大量更新了我的答案,現在完成了,我不知道你是否收到通知,但是你可能想要查看它。請告訴我,如果它不符合你對撇號的需求,我可能有一些時間來改進它,如果需要的話。 – Aaron

回答

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部分字邊界。由於我不確定這與您的興趣有關,所以我暫時不打算對此進行研究。

+0

這將排除''s'因爲它沒有爲我工作。 –

+0

@AbdulHameed可能不是,我沒有看到編輯。感謝您通知我,我會嘗試修復它:) – Aaron

+0

@AbdulHameed表明它配置爲時,至少爲OP的具體示例。 – Aaron

2

嘗試這個正則表達式(?:(?!this |is |his |a |an |the |s |\s|\.).)+gi修飾符。

它列出你想不匹配(this--> this,his, is,s)

你可以找到演示here

UPDATE各種詞的組合:

嘗試新的正則表達式:

\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

+0

它只能用於你的例子。不是每個案件。對於每種情況,我需要更多的正面和負面結果的測試用例來編寫正則表達式 –

+0

感謝您的快速回復。只是我注意到了一個問題。如果目標字符串中有像「嘶嘶聲」這樣的單詞,它們將顯示部分內容而不是整個單詞。除此之外,似乎我不能在正則表達式中添加像'|和'的相似性,因爲字符串中的'和'將被部分替換。 – sijane

+0

在你的問題中列出更多的測試用例。那麼只能獲得解決方案。 –