正则表达式匹配可能包含标点符号的单词的边界

时间:2015-09-10 11:54:47

标签: javascript regex string

我正在使用正则表达式来操作空格分隔的字符串列表。当用户希望删除标记时,正则表达式将{_ 1}替换为要删除的标记,系统将保存新列表。当用户开始输入标点作为标记的一部分(有效用例)时,这会遇到麻烦。当我意识到使用标点符号时,我开始使用正则表达式转义:

null

当与我现有的正则表达式格式(RegExp.escape = function(s){ return String(s).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&'); }; )结合使用时,在某些情况下这不匹配。

采用以下示例标记列表:\bTAGTODELETE\b

如果我要从列表中删除thisisatest? other test test2 test? test?ingtest?匹配\btest\?\b。如果我要删除test?ingthisisatest?有0个匹配。

我尝试了几次迭代,但每次都有自己的问题。

2 个答案:

答案 0 :(得分:1)

因为?

旁边没有字边界
\btest\?\B

这将匹配test?后跟test?输入ing后{s} thisisatest? other test test2 test? test?ing匹配。

\b - 单词char和非单词char之间的匹配(反之亦然)

\B - 两个单词char或两个非单词char之间的匹配。

?非单词字符space非单词字符。所以\B对于这种情况来说是完美的。

答案 1 :(得分:1)

您可以使用新的正则表达式解决当前问题,但如果您坚持使用此方法,可能会有更多令您头疼的问题。有更好的方法来管理标记,而不是将它们连接成一个字符串。

我建议您将每个标记存储在一个对象中,并将标记列表表示为此类对象的数组。

这样的事情:

var tags = [];
tags.push({ text: 'my new tag!', valid: true });
tags.push({ text: 'yeah, dude', valid: true });

如果用户操作导致valid属性设置为false,则可以扫描数组并拼出无效标记。