首页 > 解决方案 > 正则表达式匹配 kbt-y102_9999_0001v-s001r 和 kbt-y102_999a

问题描述

我正在寻找一个可以转换字符串的正则表达式

kbt-y102_9999_0001v-s001v

进入 N1v-s1v

kbt-y102_999a

进入 N1a

kbt-y102_ => ignore everything until first underscore
9999 => N
_0001v => 1v
-s001v => -s1v

kbt-y102_9999_0001v-s001r => N1v-s1r 
kbt-y102_9999_0002r-s001v => N2r-s1v
kbt-y102_9999_0001v => N1v
kbt-y102_9999_0002r => N2r
kbt-y102_999a => Na
kbt-y102_999aa => Naa
kbt-y102_9999a => Na
kbt-y102_9999aa => Naa

我的尝试涵盖了前四种情况:((.*)_[0-9]{4}_[0-9]{3}([0-9][vr])?((-s)0{0,2}+([0-9][vr]))?则表达式小提琴

但我正在努力解决999a

标签: phpregex

解决方案


按照您的模式,这是提取所需数据的通用正则表达式:

^[^_]*_\d+([a-z]*)(?:_0*([1-9][a-z])(?:(-[a-z])0*([1-9][a-z]))?)?

它很长,但在适当的地方只有一些可接受的通配符(令牌)。您需要将匹配替换为:

N$1$2$3$4

现场演示


推荐阅读