【问题标题】:Regex expression that matches #tags but not hex codes匹配 #tags 但不匹配十六进制代码的正则表达式
【发布时间】:2016-12-03 11:28:31
【问题描述】:

我正在尝试在 JavaScript 中编写一个正则表达式,它将匹配任何字符串,只要它以空格开头,然后是 octothorpe(#),然后是字符。但是,我希望这个表达式排除十六进制代码。

我有这个表达式来捕获#tags:

/([\s]#[^<\s]+)/g

我有一个表达式,它以我的较大程序将接收它们的格式 (#xxxxxx) 捕获十六进制代码:

/(#[0-9a-fA-F]{6,6}\b)/g

但我不知道如何将它们放在一起,以便最终得到第一个表达式描述的匹配项,而不是第二个表达式描述的匹配项。

我想在一个正则表达式语句中完成所有事情。如果这是不可能的,我想知道一种使用正则表达式和 JavaScript 函数的组合来获取所有以 # 开头的非十六进制字符串的方法。如果有帮助,我正在使用 jQuery 和 Backbone.js。

额外积分:

这有什么区别:

/(#[0-9a-fA-F]{6,6}\b)/g

还有这个:

/(#[0-9a-fA-F]{6}\b)/g

我一直在使用https://regex101.com 来编写和测试我的表达式,两者似乎给出了相同的结果。

【问题讨论】:

  • 你能提供测试输入吗?你想匹配什么?你想不匹配什么?额外积分:您可以创建一个 regex101.com 永久链接,显示您在做什么。
  • 额外积分:唯一的区别是:{6}{6,6} 漂亮得多

标签: javascript regex regex-negation


【解决方案1】:

您可以在您的第一个正则表达式中使用第二个正则表达式作为否定前瞻 ((?!):

(?:\s|^)(#(?![\da-fA-F]{6}\b)[^<\s]+)

我在一开始就添加了使用哈希值立即开始字符串的可能性,而不需要空格。

Regex tester

注意:{6,6} 确实与捷径完全相同:{6}。如regular-expressions.info 所述:

还有一个额外的量词,可让您指定一个标记可以重复多少次。

语法为{min,max},其中min为零或正整数,表示最小匹配数,以及max 是一个等于或大于 min 的整数,表示最大匹配数。 [...] 省略逗号和 max 会告诉引擎准确地重复令牌 min 次。

【讨论】:

  • 为什么你已经从否定表达式中删除了 0-9 部分,没有它解决方案如何仍然有效?
  • 因为\d是等价的。
猜你喜欢
  • 1970-01-01
  • 2017-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-28
  • 2017-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多