为什么我不能通过在序列边界内匹配 [a-zA-Z0-9]+ 来获得"3"?



我必须解码这些帧。帧在长字符串中,帧的开头是"CC",帧的结尾是"DD"。我想捕捉页眉和页脚之间的所有内容。

我找到了所有的框架,并将它们放入阵列中。阵列样本看起来像:

CCdatadfhdfghata1DD
CC3DD
CCdatazxczxczxczxdata3DD

现在我想从这些框架中去掉页眉和页脚。所以我准备了RegEx:

[^CC][a-zA-Z0-9]+[^DD]

但是,它不会匹配具有内容3的帧。为什么?[a-zA-Z0-9]+表达式不应该覆盖它吗?我期望:

datadfhdfghata1
3
datazxczxczxczxdata3

相反,我看到:

datadfhdfghata1
datazxczxczxczxdata3

您的正则表达式根本不符合您的期望。此处:

Negated character class: Any character that aren't "C" or "C" (aka redundant)
 |
 |    A character from the ranges
 |    |
 |    |           > A character that isn't "D" or "D"
[^CC][a-zA-Z0-9]+[^DD]

这将在非"C"(包括C)的字符、一个到多个a-zA-Z0-9和非"D"(包括D)的字符之间匹配。这种逻辑是不正确的,因为只有当序列至少有三个字符长时,它们才会匹配。更改为:

CCK[a-zA-Z0-9]+(?=DD)

表达式解释:

  • CC按字面顺序匹配"CC"
  • K丢弃匹配并保留
  • [a-zA-Z0-9]+你想要匹配的东西
  • (?=DD)断言"DD"遵循我们的匹配

这是一个regex演示。

附带说明一下,[a-zA-Z0-9]可以替换为简写类[^W_]

方括号内的^转换为NOT运算。所以你实际上是在告诉它寻找不以"C"开头的模式。

尝试CC([a-zA-Z0-9]+)DD。括号允许您从没有CC和DD块的模式中提取匹配的数据。

最新更新