Javascript 负前瞻在我需要的最后一个字符之前结束匹配

Javascript 负前瞻在我需要的最后一个字符之前结束匹配,javascript,regex,Javascript,Regex,我希望识别字符串中十六进制的部分 所以如果你考虑字符串 胆小鬼,这场比赛将是牛肉 为此,我提出了一个表达式/[A-F0-9]{2,}(?![^A-F0-9])/g 这是完美的-除了它只匹配蜜蜂,而不是牛肉。除非牛肉刚好在绳子的末端。使用 /[A-F0-9]{2,}(?![^A-F0-9])*/g 负前瞻(?![^A-F0-9])的意思是:除了A-F,0-9之外,后面跟的任何字符都不匹配。转换为匹配模式,后面是A-F,0-9。您的正则表达式与'BEE'匹配,因为它后面跟F,满足条件 如果您想识别两

我希望识别字符串中十六进制的部分

所以如果你考虑字符串

胆小鬼,这场比赛将是牛肉

为此,我提出了一个表达式
/[A-F0-9]{2,}(?![^A-F0-9])/g

这是完美的-除了它只匹配蜜蜂,而不是牛肉。除非牛肉刚好在绳子的末端。

使用

/[A-F0-9]{2,}(?![^A-F0-9])*/g


负前瞻
(?![^A-F0-9])
的意思是:除了A-F,0-9之外,后面跟的任何字符都不匹配。转换为匹配模式,后面是A-F,0-9。您的正则表达式与'BEE'匹配,因为它后面跟F,满足条件

如果您想识别两个或多个字符的十六进制代码序列,只需完全消除负前瞻。
/[A-F0-9]{2,}/g
转换为:找到尽可能多的匹配项,一个由2个或更多字符长的A-F或0-9组成的模式。

这是因为正则表达式的最后一部分:
(?![^A-F0-9])

因此,您正在匹配任何后跟非十六进制字符的字符串。。。这最终意味着查找下一个字符十六进制字符的字符串

您可以删除
^
,也可以删除整个片段,因为这不是必需的。以下内容将检索您正在查找的内容:
/[A-F0-9]{2,}/g

  • [A-F0-9]{2,}(?![A-F0-9])
    将匹配预期的内容,但是,由于默认情况下量词是贪婪的,所以负先行是多余的

  • [A-F0-9]{2,}(?![^A-F0-9])
    不起作用,因为断言后面的字符不能是除A-F0-9之外的任何字符(双重否定)


BEEF
中最后一个字符
F
不匹配的原因是,在匹配
BEEF
后,NegativeLookahead失败
p
位于
[^A-F0-9]
中,这会返回到
BEE
,成功是因为
F
不在
[^A-F0-9]

如果您需要具有基于对的值的给定结果,您可以使用
/([A-F0-9]{2})+/g
,如果不需要(如果它是否奇怪),您可以使用
/[A-F0-9]{2,}/g


希望有帮助。

你的意思是
(?![A-F0-9])
(?=[^A-F0-9])
(?![^A-F0-9])
是双重否定
[A-F0-9]{2,}
的问题是什么?@Nahuelfouillel基本上我想达到的目的是比赛在牛肉之后结束,所以我基本上符合A-F0-9,然后当有不符合A-F0-9的东西时停止。@AdityaGupta问题是它不会在牛肉之后停止,它会包括馅饼。我检查过了。PCRE和javascript都在工作。请重新检查。
(?![^A-F0-9])
(?=[A-F0-9])
不完全相同,因为第一个可以匹配空字符串