试图在字边界之外匹配零
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)
- 两个或多个字母,在它们之后有一个数字,将被省略。它将匹配TCELL
和TBNK
。 - 替代品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
以上是关于试图在字边界之外匹配零的主要内容,如果未能解决你的问题,请参考以下文章
JavaScript 将字符串截断为设定长度,在字边界处断开