在我需要的最后一个字符之前,否定前瞻结束匹配

时间:2018-03-14 12:23:14

标签: javascript regex

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

所以如果你考虑字符串

CHICKENORBEEFPIE,比赛将是BEEF。

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

这完美无缺 - 除了它只匹配BEE,而不是BEEF。除非BEEF碰巧在字符串的末尾。

5 个答案:

答案 0 :(得分:0)

否定前瞻(?![^A-F0-9])表示:不匹配除A-F,0-9以外的任何字符后面的任何内容。其转换为匹配模式,然后是A-F,0-9。你的正则表达式匹配' BEE'因为它后跟F,满足条件。

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

答案 1 :(得分:0)

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

因此,您匹配任何未跟随非十六进制字符的字符串...这最终意味着找到下一个字符 十六进制字符的字符串。

您可以删除^或完全删除整个部分,因为没有必要。以下内容将检索您要查找的内容:/[A-F0-9]{2,}/g

答案 2 :(得分:0)

  • [A-F0-9]{2,}(?![A-F0-9])会匹配预期,但负面预测是多余的,因为默认情况下量词是贪婪的。

  • [A-F0-9]{2,}(?![^A-F0-9])不起作用,因为断言是跟随字符必须是任何字符,除了 A-F0-9(双重否定)

F中的最后一个字符BEEF不匹配的原因是,在匹配BEEF后,否定前瞻失败P位于[^A-F0-9]中回溯到BEE成功,因为F不在[^A-F0-9]

答案 3 :(得分:0)

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

希望它有所帮助。

答案 4 :(得分:-1)

使用

  

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