返回一个子字符串并使用正则表达式去除结果中的前导零?

问题描述:

我必须以某种方式返回数据,这完全是由正则表达式完成的,没有任何其他代码的帮助。返回一个子字符串并使用正则表达式去除结果中的前导零?

这里是我的输入字符串这是一个固定的位置/长度:

%O1TEST  00000500135800? 
      ^start ^end 

我希望返回子在那里它开始和结束以上,但我也想删除任何前导零。最终结果将是“5001”。

如果子字符串是“123455001”,它将返回“123455001”(全部9个字符)。

我到目前为止:.{13}(.{9})返回“000005001”,但我不知道如何删除前导零。

+0

为什么在'5001'后忽略了部件? –

+0

5001之后的部分是我不想要的其他数据。我只想要从14位开始到22位结束的9个字符。 – Clutch

+0

最终目标是什么?你需要5001只使用SQL语法?你需要它作为一个字符串还是作为一个数字?什么数据库系统?你能结合一个正则表达式与其他SQL方法,如数字解析和类型转换? –

在JavaScript中,这会给你5001比赛第1组:

'%O1TEST  00000500135800?'.match(/^.{13}0*(\d*).{6}$/) 

这需要你知道总字符串长度。 ^.{13}与前13个字符匹配,.{6}$与最后6个字符匹配,0*吃掉所有前导零并且(\d*)匹配任何剩余的数字。

如果您能够回答我上面关于您最终需要什么和您的语言的评论,我可能会为您提供更好的答案。并非所有的正则表达式都是平等的。

+0

你做到了!我很抱歉,但我应该更好地回答我的问题。谢谢! – 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}()) 

Live Example

的空间将确保我们从一开始就数相匹配的匹配。每个选项是总共9位,与可变数量前导0的从0到9

此正则表达式能够像匹配的东西:

  • %O1TEST 00000500135800?
  • %O1TEST 000000500135800?
  • %O1TEST 000005001358000?

独立于数字的大小只有前9个字符将被采取和前导零将从比赛中切碎。