我有这些文件名的文件:
ZATR0008_2018.pdf
ZATR0018_2018.pdf
ZATR0218_2018.pdf
ZATR
之后的4位数是杂志的发行号。
这个正则表达式:
([1-9][0-9]*)(?=_\d)
我可以提取8
,18
或218
,但我希望保留最少2位数和最多3位数,因此结果应为08
,{{1 }和18
。
怎么可能这样做?
答案 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)
在这里,\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-808
第2场比赛全场比赛18-35
ZATR0018_2018.pdf
第1组.24-2618
第3场比赛全场比赛36-53
ZATR0218_2018.pdf
第1组.41-44218