我正在使用正则表达式来操作空格分隔的字符串列表。当用户希望删除标记时,正则表达式将{_ 1}替换为要删除的标记,系统将保存新列表。当用户开始输入标点作为标记的一部分(有效用例)时,这会遇到麻烦。当我意识到使用标点符号时,我开始使用正则表达式转义:
null
当与我现有的正则表达式格式(RegExp.escape = function(s){
return String(s).replace(/[\\^$*+?.()|[\]{}]/g, '\\$&');
};
)结合使用时,在某些情况下这不匹配。
采用以下示例标记列表:\bTAGTODELETE\b
如果我要从列表中删除thisisatest? other test test2 test? test?ing
,test?
匹配\btest\?\b
。如果我要删除test?ing
,thisisatest?
有0个匹配。
我尝试了几次迭代,但每次都有自己的问题。
答案 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,则可以扫描数组并拼出无效标记。