正则表达式匹配#tags但不匹配十六进制代码

时间:2016-07-28 21:32:01

标签: javascript regex regex-negation

我正在尝试在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来编写和测试我的表达式,两者似乎都给出了相同的结果。

1 个答案:

答案 0 :(得分:2)

您可以在第一个正则表达式中使用第二个正则表达式((?!):

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

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

请参阅Regex tester

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

  

还有一个额外的量词,可以指定令牌重复的次数。

     

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