正则表达式仅匹配字符串,而不是子字符串

时间:2017-04-18 10:00:45

标签: javascript regex string

当单击表中的值时,我正在向textarea添加字符串。必须可以在表格中选择和取消选择值,它们将在textarea中添加/删除它们。 textarea必须是一个字符串,添加的值不能包含在任何其他字符中。

正在添加的值可能会有任何字符,并且可能将其中一个值作为子字符串,以下是一些示例:HOLE 1HOLE 11,{{1 }},HOLE 17HOLE (1)cutawaycutawaycut-awayCommentator (SMITH, John)(GOAL)

一旦将值附加到textarea,然后再次单击以取消选择它,我就会搜索该值并将其删除:

GOAL

正则表达式正确匹配文本的字符串/子字符串,例如var regex = new RegExp("(?![ .,]|^)?(" + mySelectedText + ")(?=[., ]|$)", 'g'); var newDescriptionText = myTextAreaText.replace(regex, ''); cutaway然而,对于以括号开头的任何内容都不适用away。将单词边界选择器添加到表达式(GOAL)的开头,将使正则表达式匹配以括号开头的字符串,但不适用于包含相同文本的字符串/子字符串。

有没有办法用正则表达式实现这一目标?还是其他一些方法?

这是从表中添加/删除的有效CodePen example

1 个答案:

答案 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;
    };