【问题标题】:regex for matching words starting with special chars用于匹配以特殊字符开头的单词的正则表达式
【发布时间】:2015-03-03 18:16:22
【问题描述】:

我正在尝试匹配字符串中的#TEST.. 可以说它的“这是一个#TEST”

执行匹配的脚本自动将搜索字符串包装在 \b 标记中,因此生成的正则表达式将如下所示: \b#TEST\b .. 这显然不起作用。

如何更改搜索字符串以使其正常工作?

编辑:我选择更改包装函数,因此生成的表达式如下所示:

(?<!\S)#TEST(?!\S)

edit2:转义我的文本..

【问题讨论】:

  • \b#TEST\b 在这种情况下只会匹配 (?&lt;=\w|^)# ... 。再次解释为什么不能更改自动将\b 放在那里的脚本?
  • 要匹配的字符串列表是迄今为止正常的单词,并且主要由不了解正则表达式的非技术人员维护。这个案例是一个边缘案例,所以它只是为了让维护它的人(大部分)保持简单。我可以将脚本更改为不包装字符串,但是列表对某些人来说会是乱码。它实际上给了我一个想法。使用 (?
  • (?&lt;!\S) .. (?!\S) 作为包装器优于(?&lt;=\s) .. (?=\s),因为它使用了另一个满足 BOS/EOS 的否定条件。然而,它可能会遗漏一些东西,比如用标点符号包裹的单词,比如\b 会给你的东西。另一种选择是使用条件边界作为包装器。 (?(?=\w)\b) .. (?(?&lt;=\w)\b) 这将检查单词字符的第一个和最后一个字母,然后应用\b 断言(如果找到)。甚至可以混合它。 (?(?=\w)\b|(?&lt;!\S)) .. (?(?&lt;=\w)\b|(?!\S))
  • 酷,谢谢你的输入 sln :)

标签: regex special-characters word-boundaries


【解决方案1】:

你可能会使用:

(^|\W)TEST\b

RegEx Demo

即匹配左侧 TEST 之前的行开头或非单词字符。

【讨论】:

  • 当你输入自动词边界\b(^|\W)TEST\b时你会得到什么?
  • 我有没有提到在此之前放置\b 的地方?如果用户可以提交#TEST 输入,那么最好不要在它之前使用\b
  • 你失去了我。 \W 匹配 #。也许您没有阅读关于自动包装 \b 的脚本的 OP 声明。因此,将您的正则表达式更改为 \b(^|\W)TEST\b 将永远不会匹配“#Test”
  • 如果 OP 愿意放弃\b 那为什么还要坚持旧的要求呢?
【解决方案2】:

“\”字符正在转义“b”字符。将 '\b' 替换为 '\\b',假设您的函数实际上是用 '\b' 包装搜索字符串。

所以: '\\b#TEST\\b'

【讨论】:

    【解决方案3】:

    您可以通过断言 # 来克服这一点,但它不会成为匹配的一部分。
    但是,它也不会匹配其他任何东西。

    \b(?&lt;=#)TEST\b

    所以传入(?&lt;=#)TEST

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-17
      • 1970-01-01
      • 2014-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-08
      • 1970-01-01
      相关资源
      最近更新 更多