正则表达式可以匹配吗?

时间:2017-12-25 20:10:56

标签: regex match digits

我有这些文件名的文件:

ZATR0008_2018.pdf
ZATR0018_2018.pdf
ZATR0218_2018.pdf

ZATR之后的4位数是杂志的发行号。

这个正则表达式:

([1-9][0-9]*)(?=_\d)

我可以提取818218,但我希望保留最少2位数和最多3位数,因此结果应为08,{{1 }和18

怎么可能这样做?

4 个答案:

答案 0 :(得分:2)

您可以使用

0*(\d{2,3})_\d

并抓取第1组值。请参阅the regex demo

<强>详情

  • 0* - 零个或多个0字符
  • (\d{2,3}) - 第1组:两位或三位
  • _\d - _后跟数字。

这是一个PCRE变体,可以将整个匹配所需的值抓取:

0*\K\d{2,3}(?=_\d)

请参阅another regex demo

在这里,\K使正则表达式引擎省略了到目前为止匹配的文本(零),然后匹配2到3位数字,后跟_和数字。

答案 1 :(得分:1)

(?:[1-9][0-9]?)?[0-9]{2}(?=_[0-9])

或者也许:

(?:[1-9][0-9]+|[0-9]{2})(?=_[0-9])

https://www.freeformatter.com/regex-tester.html,声称使用XRegExp库,你在另一个答案中提到的似乎并没有在必要的第一个建议中回溯到(?:)?,这使得它与我之前曾经遇到的任何正则表达式引擎,并且它更喜欢只匹配18的{​​{1}},即使它在字符串后面开始。但它确实适用于我的第二个建议。

答案 2 :(得分:0)

([1-9]\d{2,3})(?=_\d)

{x,y}将匹配前一个模式的x到y倍,在本例中为\ d

编辑:从你自己的正则表达式看起来你想要的数字部分以非零开头。但是,由于您的示例包含前导0,您可能真的想要:

   (\d{2,3})(?=_\d)

除非只有2位数字,否则会在下划线前给出最后3位数字。

答案 3 :(得分:0)

我建议你:

^ZATR0*(\d{2,3})_\d+\.pdf$

演示代码here。结果:

  

匹配1完整匹配0-17 ZATR0008_2018.pdf组1. 6-8 08

     

第2场比赛全场比赛18-35 ZATR0018_2018.pdf第1组.24-26 18

     

第3场比赛全场比赛36-53 ZATR0218_2018.pdf第1组.41-44 218