【发布时间】:2017-10-30 03:02:49
【问题描述】:
抱歉打扰了,当谈到正则表达式时,我感到永远迷失......
我必须匹配出现在较长十六进制值序列中的字符串。我的测试字符串是这样的:
BF1301020302000017BF1301030101010300FF6ABF130201010300FFC0BF1303010303030100FF98
图案是这样的:
- 从 BF13 开始
- 后跟未知数量的“01”、“02”或“03”重复 (\w\w)
- 00标志着BF13和00之间序列的终止
- 在 00 结束符之后,总是有 4 个额外的字符
我试过BF13(\w\w)+?00(\w\w){1},但显然是错误的。
测试字符串应该匹配并输出这些值:
- BF1301020302000017
- BF1301030101010300FF6A
- BF130201010300FFC0
- BF1303010303030100FF98
谢谢各位!
【问题讨论】:
-
你的模式有效,你只需要
{2}而不是最后的{1},因为总是有4个额外的字符。 Live test working here -
试试这个
BF13(0[1-3])+00([0-9A-F]{4})。在这里你匹配BF13然后0(1 or 2 or 3)1 次或更多次,然后00然后 0 到 9 或 A 到 F(区分大小写)4 次。 -
啊!你是对的@WashingtonGuedes。我忘了在 phpliveregex 中切换到 preg_match_all ......我的错!谢谢!!!
-
@Alex 小心你的正则表达式,你接受任何带有
\w的东西,而不仅仅是01、02或03,所以它不是一个“有效”的正则表达式。 -
另外,捕获组可能无法捕获您想要的内容。 (注意它捕获了第一部分的
0217,而不是0017,这将是最后2个字节)
标签: php regex hex preg-match-all substring