【发布时间】:2015-03-03 18:16:22
【问题描述】:
我正在尝试匹配字符串中的#TEST.. 可以说它的“这是一个#TEST”
执行匹配的脚本自动将搜索字符串包装在 \b 标记中,因此生成的正则表达式将如下所示: \b#TEST\b .. 这显然不起作用。
如何更改搜索字符串以使其正常工作?
编辑:我选择更改包装函数,因此生成的表达式如下所示:
(?<!\S)#TEST(?!\S)
edit2:转义我的文本..
【问题讨论】:
-
\b#TEST\b在这种情况下只会匹配(?<=\w|^)# ...。再次解释为什么不能更改自动将\b放在那里的脚本? -
要匹配的字符串列表是迄今为止正常的单词,并且主要由不了解正则表达式的非技术人员维护。这个案例是一个边缘案例,所以它只是为了让维护它的人(大部分)保持简单。我可以将脚本更改为不包装字符串,但是列表对某些人来说会是乱码。它实际上给了我一个想法。使用 (?
-
(?<!\S) .. (?!\S)作为包装器优于(?<=\s) .. (?=\s),因为它使用了另一个满足 BOS/EOS 的否定条件。然而,它可能会遗漏一些东西,比如用标点符号包裹的单词,比如\b会给你的东西。另一种选择是使用条件边界作为包装器。(?(?=\w)\b) .. (?(?<=\w)\b)这将检查单词字符的第一个和最后一个字母,然后应用\b断言(如果找到)。甚至可以混合它。(?(?=\w)\b|(?<!\S)) .. (?(?<=\w)\b|(?!\S)) -
酷,谢谢你的输入 sln :)
标签: regex special-characters word-boundaries