试图在字边界之外匹配零

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了试图在字边界之外匹配零相关的知识,希望对你有一定的参考价值。

我有类似的模式 FQC19515_TCELL001_20190319_165944.pdf FQC19515_TBNK001_20190319_165944.pdf 我可以用这个RegEX匹配TCELL和TBNK这个词 ^( d +) - ( d +) - 。( d +)([A-Z1-9] +)* 但如果我有类似的模式 FLW194640_T20NK022_20190323_131348.pdf FLW194228_C1920_SOME_DEBRIS_REMOVED.pdf 上面的正则表达式返回 T2和C192分别代替T20NK和C1920 是否有一般的正则表达式将Nzeros与这些单词边界相匹配?

答案

让我们考虑一下你输入的所有4个例子:

FQC19515_TCELL001_20190319_165944.pdf
FQC19515_TBNK001_20190319_165944.pdf
FLW194640_T20NK022_20190323_131348.pdf
FLW194228_C1920_SOME_DEBRIS_REMOVED.pdf

第一组,在行首和第一行“_”之间(例如第1行中的FQC19515)包括:

  • 一个非空的字母序列,
  • 一个非空的数字序列。

所以匹配它的正则表达式,包括行锚和捕获组的开始是:

^([A-Z]+d+)

您使用D而不是[A-Z],但我认为[A-Z]更具体,因为它只匹配字母而不是“_”。

下一个源char是_,所以正则表达式也可以包括_

现在更困难的部分:要捕获的第二组实际上有两个变体:

  • 一系列字母和一系列数字(之后有一个“_”),
  • 一系列字母,一系列数字和另一个字母序列(之后有你想要省略的数字)。

因此,最直观的方法是定义两个备选方案,每个备选方案都具有相应的正向前瞻:

  • 替代方案1:[A-Z]+d+(?=_)
  • 替代方案2:[A-Z]+d+[A-Z]+(?=d)

但是有一点短路。请注意,这两种选择都是从[A-Z]+d+开始的。所以我们可以将这个片段放在第一位,只有其余的包含作为非捕获组((?:...)),有2个替代方案。以上所有内容都应该包含一个捕获组:

([A-Z]+d+(?:(?=_)|[A-Z]+(?=d)))

所以整个正则表达式可以是:

^([A-Z]+d+)_([A-Z]+d+(?:(?=_)|[A-Z]+(?=d)))

使用m选项(“^”也匹配每行的开头)。

有关工作示例,请参阅https://regex101.com/r/GDdt10/1

你的正则表达式:^(D+)-(d+)是错误的,因为你指定了一个非数字序列(D+),你的源中没有出现这种情况。第二个减号也与您的输入不对应。

Edit

要匹配所有字符串,我稍微修改了以前的正则表达式。更改仅限于匹配组No 2(在_之后):

  • 替代品1:[A-Z]{2,}+(?=d) - 两个或多个字母,在它们之后有一个数字,将被省略。它将匹配TCELLTBNK
  • 替代品2:[A-Z]+d+(?:(?=_)|[A-Z]+(?=d)) - 此组的先前内容。它将匹配其余两个案例。

所以整个正则表达式是:

^([A-Z]+d+)_([A-Z]{2,}+(?=d)|[A-Z]+d+(?:(?=_)|[A-Z]+(?=d)))

有关工作示例,请参阅https://regex101.com/r/GDdt10/2

另一答案

据我了解,您可以使用:

^[A-Z]+d+_K[A-Z0-9]{5}

说明:

^                   # beginning of line
    [A-Z]+          # 1 or more capitals
    d+_            # 1 or more digit and 1 underscore
    K              # forget all we have seen until this position
    [A-Z0-9]{5}     # 5 capitals or digits

Demo

以上是关于试图在字边界之外匹配零的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript 将字符串截断为设定长度,在字边界处断开

NIST建议的零信任安全8大应用场景

如何将图例放在字段集边界之外

如何 GetMousePosition 在屏幕上的任何位置,在窗口(或任何视觉)边界之外

正则表达式入门边界

正则基础之  单词边界