2017-04-18 152 views
2

當單擊表中的值時,我將字符串添加到textarea。必須可以選擇和取消選擇表中的值,並且他們將自己從textarea中添加/刪除自己。 textarea必須是一個字符串,並且添加的值不能包含在任何其他字符中。正則表達式僅匹配字符串,而不是子字符串

正在加入可以potentailly有任何字符,並且可具有其他的值作爲子串中的一個的值,這裏是一些例子:HOLE 1HOLE 11HOLE 17HOLE (1)cutawaycutawaycut-awayCommentator (SMITH, John)(GOAL)GOAL

一旦值已追加到textarea的,它的點擊再次取消它,我在尋找的價值,像這樣將其取出:

var regex = new RegExp("(?![ .,]|^)?(" + mySelectedText + ")(?=[., ]|$)", 'g'); 
var newDescriptionText = myTextAreaText.replace(regex, ''); 

正則表達式正確匹配文本的字符串/子字符串,例如然而,cutawayaway不適用於以括號開頭的任何內容,例如(GOAL)。將字邊界選擇器添加到表達式\b的開頭,將使正則表達式匹配以括號開頭但不適用於包含相同文本的字符串/子字符串的字符串。

有沒有辦法實現這個使用正則表達式?或者其他一些方法?

這是一個正在運行的CodePen example的添加/刪除表。

+0

你要對這個錯誤的方式。爲什麼不將選定的值保存在'array'中,並根據值更改時刷新'textarea'的內容? – Sebastian

+0

我也在想這個,但用戶也可以在框中輸入,例如「看看HOLE 1'現在看看'HOLE 11' blah blah',但通過鍵入他們可以點擊'HOLE 1'並將其刪除,儘管再次考慮它,我可能會存儲一組對象包含字符串本身以及它在textarea中的當前開始位置 –

回答

2

當您取消選擇away並在列表中有cutaway時,可以使用字邊界(\b)來避免問題。只要改變正則表達式:

regex = new RegExp("(?![ .,]|^)?(\\b" + cellText + "\\b)(?=[., ]|$)", 'g'); 
           ^^^    ^^^ 

這是我改變,使它的工作原理代碼:

removeFromDescription = function(cell) { 
     cell.classList.remove(activeClass); 

     // Remove from the active cells arry 
     var itemIndex = tempAnnotation.activeCells.indexOf(cell.textContent); 
     tempAnnotation.activeCells.splice(itemIndex, 1); 

     // Do the regex find/replace 
     var annotationBoxText = annotation.value, 
     cellText = regexEscape(cell.textContent), // Escape any funky characters from the string 

     regex = new RegExp("(^|)" + cellText + "(|$)", 'g'); 

     var newDescription = annotationBoxText.replace(regex, ' '); 

     setAnnotationBoxValue(newDescription); 

     console.info('cellText:   ', cellText); 
     console.info('annotationBoxText:', annotationBoxText); 
     console.info('newDescription: ', newDescription); 
    }; 

    regexEscape = function(s) { 
     return s.replace(/([-\/\\^$*+?.()|[\]{}])/g, `\\$&`); 
    }; 

    setAnnotationBoxValue = function(newValue) { 
     annotation.value = newValue; 
    }; 
+0

您正確的做法是使正確匹配子字符串,但是如果'cellText =(GOAL)'即以括號開頭,這將不匹配 –

+0

@JoeHastings請參閱編輯:) –

+0

完美!非常感謝 –

相關問題