正则表达式捕获具有奇数个字符的十六进制数

Regular expression to capture hex numbers with odd number of characters

我有一个逗号分隔的十六进制数字列表,如下所示,

    aaffd,123,1,d3213,aaa,f
    aaa,dd,1234,d,c

而且我希望 pcregrep 的正则表达式仅匹配包含十六进制数字的行,其中每个十六进制数字具有奇数个字符。

应该匹配:

    aaffd,123,1,d3213,aaa,f
    1
    2,345,1

不应该匹配:

    ad,ad
    1,23,1,333

我正在尝试使用这个正则表达式 ([0-9a-f],?|((?:(?:[0-9a-f]{2})+[0-9a-f]),?))+

但它也会捕获不必要的行。如图link https://regex101.com/r/uvJcbD/5

如何只捕获包含十六进制数字且每个十六进制数字的字符数为奇数的行?提前谢谢你。

这样就可以了:

^(?=[0-9a-f,]+$)[^,](?:[^,]{2})*(?:,[^,](?:[^,]{2})*)*$

DEMO

您可以通过重复该范围零次或多次 [a-f0-9]{2} 然后重复该范围 1 次来匹配奇数个字符。

重复前面的模式零次或多次,但前面加逗号。

^(?:[a-f0-9]{2})*[a-f0-9](?:,(?:[a-f0-9]{2})*[a-f0-9])*$

Regex demo

说明

  • ^ 字符串开头
  • (?:非捕获组
    • [a-f0-9]{2}匹配2次字符a-f0-9
  • )*关闭非捕获组并重复0+次
  • [a-f0-9]匹配字符a-f0-9
  • (?:非捕获组
    • ,匹配逗号
    • (?:非捕获组
      • [a-f0-9]{2}匹配2次字符a-f0-9
    • )*关闭非捕获组并重复0+次
    • [a-f0-9]匹配字符a-f0-9
  • )*关闭非捕获组
  • $ 字符串结束

应该这样做:

^(?:\b\w(?:\w\w)*\b,?)*$

它匹配不限数量的 个包含奇数个字符的单词。它使用单词边界 (\b) 来检测单词的开始和结束,并允许使用可选的逗号(以便能够匹配最后一个)。

如果您还想十六进制字符的语法检查(即只有有效的十六进制字符),请使用

^(?:\b[a-f0-9](?:[a-f0-9]{2})*\b,?)*$

See it (the first one) here at regex101.