首页 > 解决方案 > 零填充正则表达式取决于数字的长度

问题描述

我有一个字段,其中包含两个字符、一些数字和可能的单个字母。例如

QU1Y
ZL002
FX16
TD8
BF007P
VV1395
HM18743
JK0001

我想始终如一地返回原始位置的所有字母,但数字如下。

对于 1 到 3 位:返回所有数字或用零填充的数字

对于 4 位或更多位:它不能以零开头并返回前 4 位数字,或者如果第一个数字是零,则截断为三位数字

上面数据的例子

QU001Y
ZL002
FX016
TD008
BF007P
VV1395
HM1874
JK001

实现将在 R 中,但我对直接的正则表达式解决方案感兴趣,我将解决 R 方面的问题。在直接的正则表达式中可能不可能,这就是为什么我无法理解它的原因。

这确定了正确的,但我希望纠正那些不正确的。

"[A-Z]{2}[1-9]{0,1}[0-9]{1,3}[F,Y,P]{0,1}"

对于好奇的人,它们是航班号,但由人类输入。因此品种...

标签: rregexstringr

解决方案


您可以使用

> library(gsubfn)
> l <- c("QU1Y", "ZL002", "FX16", "TD8", "BF007P", "VV1395", "HM18743", "JK0001")
> gsubfn('^[A-Z]{2}\\K0*(\\d{1,4})\\d*', ~ sprintf("%03d",as.numeric(x)), l, perl=TRUE)
[1] "QU001Y" "ZL002"  "FX016"  "TD008"  "BF007P" "VV1395" "HM1874" "JK001" 

模式匹配

  • ^- 字符串的开始
  • [A-Z]{2}- 两个大写字母
  • \\K- 到目前为止匹配的文本从匹配中删除
  • 0*- 0 个或多个零
  • (\\d{1,4})- 捕获组 1:一到四位数
  • \\d*- 0+ 位数。

第 1 组被传递给回调函数,在sprintf("%03d",as.numeric(x))该函数中用必要数量的数字填充值。


推荐阅读