返回一个子字符串并使用正则表达式去除结果中的前导零?
我必须以某种方式返回数据,这完全是由正则表达式完成的,没有任何其他代码的帮助。返回一个子字符串并使用正则表达式去除结果中的前导零?
这里是我的输入字符串这是一个固定的位置/长度:
%O1TEST 00000500135800?
^start ^end
我希望返回子在那里它开始和结束以上,但我也想删除任何前导零。最终结果将是“5001”。
如果子字符串是“123455001”,它将返回“123455001”(全部9个字符)。
我到目前为止:.{13}(.{9})
返回“000005001”,但我不知道如何删除前导零。
在JavaScript中,这会给你5001比赛第1组:
'%O1TEST 00000500135800?'.match(/^.{13}0*(\d*).{6}$/)
这需要你知道总字符串长度。 ^.{13}
与前13个字符匹配,.{6}$
与最后6个字符匹配,0*
吃掉所有前导零并且(\d*)
匹配任何剩余的数字。
如果您能够回答我上面关于您最终需要什么和您的语言的评论,我可能会为您提供更好的答案。并非所有的正则表达式都是平等的。
你做到了!我很抱歉,但我应该更好地回答我的问题。谢谢! – Clutch
您的捕获组将采取从14到22的所有字符,因此您必须限制它。下面的正则表达式应该做的工作,因为它忽略了前13个字符,则忽略任何前导零和零的任何序列后,最后五位数字之前,所有的数字捕获:
.{13}0*([0-9]+)[0-9]{5}
我不知道你正在尝试什么,但是这个正则表达式接受任何前导零的序列,包括00000000035800
,只捕获最后一个零。在这种情况下结果将为0
。
如果你改变了正则表达式:
.{13}0*([0-9]*)[0-9]{5}
它也将匹配序列00000000035800
但一个空字符串将被捕获组返回。
使用能够更好地满足您的要求的产品。
如果您确定字段中匹配的字符数Mark Evaul's answer是一个不错的选择。如果你不确定数字的位数,这相当困难。
不幸的是,你可以用一个捕获的量词做的唯一事情是在随后的匹配中多次递归:http://www.rexegg.com/regex-quantifier-capture.html即使这样,它也只是被高级正则表达式语言支持。
所以你坚持列举所有可能的组合,值得庆幸的是目前只有10:
\s(?:([1-9]\d{8})|0([1-9]\d{7})|0{2}([1-9]\d{6})|0{3}([1-9]\d{5})|0{4}([1-9]\d{4})|0{5}([1-9]\d{3})|0{6}([1-9]\d{2})|0{7}([1-9]\d)|0{8}([1-9])|0{9}())
的空间将确保我们从一开始就数相匹配的匹配。每个选项是总共9位,与可变数量前导0的从0到9
此正则表达式能够像匹配的东西:
%O1TEST 00000500135800?
%O1TEST 000000500135800?
%O1TEST 000005001358000?
独立于数字的大小只有前9个字符将被采取和前导零将从比赛中切碎。
为什么在'5001'后忽略了部件? –
5001之后的部分是我不想要的其他数据。我只想要从14位开始到22位结束的9个字符。 – Clutch
最终目标是什么?你需要5001只使用SQL语法?你需要它作为一个字符串还是作为一个数字?什么数据库系统?你能结合一个正则表达式与其他SQL方法,如数字解析和类型转换? –