【问题标题】:Regex match on string only, not substrings正则表达式仅匹配字符串,不匹配子字符串
【发布时间】:2017-04-18 10:00:44
【问题描述】:

单击表格中的值时,我正在向文本区域添加字符串。必须可以选择和取消选择表格中的值,并且它们将从文本区域中添加/删除自己。 textarea 必须是字符串,并且添加的值不能被任何其他字符包裹。

正在添加的值可能包含任何字符,并且可能包含其他值之一作为子字符串,以下是一些示例:HOLE 1HOLE 11HOLE 17HOLE (1)cutawaycutawaycut-awayCommentator (SMITH, John)(GOAL)GOAL

一旦一个值被附加到文本区域,并且再次单击它以取消选择它,我正在搜索该值并将其删除,如下所示:

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

正则表达式正确匹配文本的字符串/子字符串,例如cutawayaway 但不适用于以括号开头的任何内容,例如(GOAL)。将单词边界选择器添加到表达式 \b 的开头,将使正则表达式匹配以括号开头的字符串,但不适用于包含相同文本的字符串/子字符串。

有没有办法使用正则表达式来实现这一点?还是其他方法?

这是从表中添加/删除的工作 CodePen example

【问题讨论】:

  • 你做错了。为什么不将选定的值保留在array 中,并在值更改时根据该值刷新textarea 的内容?
  • 我也在考虑这个,但用户也可以在框中输入,例如“看看HOLE 1 现在看看HOLE 11 等等等等”,但是在打字的中途他们可以点击HOLE 1 并删除它,尽管再想一想我可能会存储一个包含字符串的对象数组自身及其在 textarea 中的当前起始位置

标签: javascript regex string


【解决方案1】:

当您取消选择 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;
    };

【讨论】:

  • 没错,这确实使该正则表达式正确匹配子字符串,但是如果 cellText = (GOAL) 即以括号开头,则将不匹配
猜你喜欢
  • 2011-11-08
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
  • 1970-01-01
  • 2012-06-05
  • 2013-12-25
相关资源
最近更新 更多