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

时间:2016-03-23 18:31:27

标签: regex parsing

我必须以某种方式返回数据,这必须完全由正则表达式完成,没有任何其他代码的帮助。

这是我的输入字符串,它是固定的位置/长度:

%O1TEST      00000500135800?
             ^start  ^end

我想返回它开始和结束的子字符串,但我也想删除任何前导零。最终结果将是" 5001"。

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

到目前为止我有这个:.{13}(.{9})返回" 000005001"但我也无法弄清楚如何删除前导零。

3 个答案:

答案 0 :(得分:1)

在javascript中,这将为匹配组1提供5001:

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

这要求您知道总字符串长度。 ^.{13}与前13个字符匹配,.{6}$与最后6个字符匹配,0*会占用所有前导零,(\d*)匹配任何剩余数字。

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

答案 1 :(得分:0)

你的捕获小组正在从14到22获取所有角色,所以你必须限制它。以下正则表达式应该完成这项工作,因为它会忽略前13个字符,然后忽略任何前导零并捕获任意零序列之后和最后五位数之前的所有数字:

.{13}0*([0-9]+)[0-9]{5}

我不知道你在尝试什么,但这个正则表达式接受任何前导零序列,包括00000000035800,只捕获最后一个。在这种情况下,结果将是0

如果将正则表达式更改为:

.{13}0*([0-9]*)[0-9]{5}

它也将匹配序列00000000035800,但捕获组将返回一个空字符串。

使用最符合您要求的那个。

答案 2 :(得分:0)

如果你确定匹配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个字符,并且会从匹配中切断前导零。