当单击表中的值时,我正在向textarea添加字符串。必须可以在表格中选择和取消选择值,它们将在textarea中添加/删除它们。 textarea必须是一个字符串,添加的值不能包含在任何其他字符中。
正在添加的值可能会有任何字符,并且可能将其中一个值作为子字符串,以下是一些示例:HOLE 1
,HOLE 11
,{{1 }},HOLE 17
,HOLE (1)
,cutaway
,cut
,away
,cut-away
,Commentator (SMITH, John)
,(GOAL)
一旦将值附加到textarea,然后再次单击以取消选择它,我就会搜索该值并将其删除:
GOAL
正则表达式正确匹配文本的字符串/子字符串,例如var regex = new RegExp("(?![ .,]|^)?(" + mySelectedText + ")(?=[., ]|$)", 'g');
var newDescriptionText = myTextAreaText.replace(regex, '');
和cutaway
然而,对于以括号开头的任何内容都不适用away
。将单词边界选择器添加到表达式(GOAL)
的开头,将使正则表达式匹配以括号开头的字符串,但不适用于包含相同文本的字符串/子字符串。
有没有办法用正则表达式实现这一目标?还是其他一些方法?
这是从表中添加/删除的有效CodePen example。
答案 0 :(得分:2)
当您取消选择\b
并在列表中拥有away
时,您可以使用字边界(cutaway
)来避免出现问题。只需将正则表达式更改为:
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;
};