2017-06-10 43 views
2

我有一個HTML文本區域,將有條目,可以如下所示:正則表達式匹配行條目以空格填充在textarea的

google.com 
    youtube.com word word 
    netflix.com 
twitch.tv 
    vimeo.com word 
soundcloud.com word word 

我要做出特色,將通過列表的搜索url並刪除它的所有條目。要做到這一點,我首先需要一個正則表達式來查找第一個匹配項。請注意,我只需要並希望找到第一個匹配項。

該功能只能刪除完全匹配。也就是說,

DeleteEntry("youtube.com"); 

不要刪除第二行,但

DeleteEntry("youtube.com word word"); 

應該。

所以基本上,我需要匹配這一模式

(beginningOfString OR newlineChar) then (anyWhiteSpaceExceptNewline) then (ENTRY) then (anyWhiteSpaceExceptNewline) then (endOfString OR newlineChar) 

這是我迄今爲止

var expression = "\n|^[ \f\r\t\v]*" + entry + "[ \f\r\t\v]*\n|$"; 
var match = listbox.value.match(expression); 

它似乎沒有工作我期待的方式它來。

+0

你能告訴我們你有什麼迄今所做。 –

+0

我已經在這個問題的底部了... –

+0

你可以試着用'm'標誌 - 'var expression = new RegExp(「^ [\ f \ r \ t \ v] *」+ entry +「[ \ f \ r \ t \ v] * $「,」m「);' –

回答

1

注意:如果要在字符串中使用\,則必須將其轉義。 "\some text"是錯誤的,但是"\\some text"是正確的。

var ta = document.getElementById("ta"), 
 
    inp = document.getElementById("inp"), 
 
    btn = document.getElementById("btn"); 
 
    
 
// escape text to be used inside RegeExp (from: https://stackoverflow.com/q/3115150/6647153) 
 
function escape(text) { 
 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, '\\$&'); 
 
} 
 

 
function deleteEntry(query) { 
 
    var text = ta.value; 
 
     
 
    var regexText = query.trim()         // remove surrounding spaces 
 
         .split(/\s+/)        // split into tokens ("a b c" becomes ["a", "b", "c"]) 
 
         .map(escape)        // escape the tokens ("a.com" becomes "a\\.c" so it'll be /a\.c/ where the '.' is regarded as litteral '.' not as the special character .) 
 
         .join("\\s+");        // joins the tokens together with \s+ (["a", "b", "c"] becomes "a\\s+b\\s+c" so it'll be /a\s+b\s+c/) 
 
     
 
    var regex = new RegExp("^\\s*" + regexText + "\\s*$", "gm"); // surrond regexText with ^\s* and \s*$ and use the g modifier for multiple matches and the m modifier for multiline text 
 
    
 
    ta.value = text.replace(regex, "");        // replace the matched text with "" and reassign it back to the textarea 
 
} 
 
    
 
btn.onclick = function() { 
 
    deleteEntry(inp.value);           // calling deleteEntry passing to it the input's value as the query 
 
}
textarea { 
 
    display: block; 
 
    width: 100%; 
 
    height: 100px; 
 
}
<textarea id="ta"> 
 
google.com 
 
    youtube.com word word 
 
    netflix.com 
 
twitch.tv 
 
    vimeo.com word 
 
soundcloud.com word word 
 
</textarea> 
 
<input id="inp"><button id="btn">Delete</button>

+0

我從中得到的是使用多行選項,這可以簡化表達式。看起來我的原始正則表達式可能會像下面這樣使用一些額外的括號:'「(^ | \ n)[\ f \ r \ t \ v] *」+ entry +「[\ f \ r \ t \ v] *(\ n | $)「'我不確定爲什麼這些人會工作,但我確實得到了預期的行爲。 –

+0

此外:爲了我的目的,我需要在列表字符串中獲取匹配的開始和結束索引,因爲我想選擇匹配並運行刪除命令,以便刪除將添加到瀏覽器的撤消/恢復堆棧中。因此,我使用'match()'和'indexOf()'和'match.length'來獲取開始和結束索引,而不是使用'replace'。在上面的註釋中使用我的替代非多行方法,您可以從一個'match()'調用中獲得匹配字符串,匹配長度和開始索引。 –

+0

這個答案還包括首先從url中轉義特殊的正則表達式字符,我沒有提到我在這篇原文中做過的事情。一定要這樣做。 –