我有这些文件名:
ZATR0008_2018.pdf
ZATR0018_2018.pdf
ZATR0218_2018.pdf其中ZATR后面的4位数字是杂志的发行号。
用这个正则表达式:
([1-9][0-9]*)(?=_\d)我可以提取8,18或218,但是我想保留最少2位和最大3位,所以结果应该是08,18和218。
怎么可能这样做呢?
发布于 2017-12-25 20:35:00
你可以用
0*(\d{2,3})_\d拿走第一组的价值。见regex演示。
详细信息
0* -零或多个0字符(\d{2,3}) -第一组:两位或三位数_\d -- _后面跟着一个数字。下面是一个PCRE变体,它将所需的值获取到一个完整的匹配中:
0*\K\d{2,3}(?=_\d)请参阅另一个regex演示
在这里,\K让regex引擎省略到目前为止匹配的文本(零),然后匹配2到3位数字,后面跟着_和一个数字。
发布于 2017-12-25 21:34:13
(?:[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库,在必要时我的第一个建议似乎并没有回溯到(?:)?中,这使得它与我以前封装的任何regex引擎都有很大的不同,并且使得它更倾向于只匹配18 of 218,即使它在字符串的后面开始。但这确实适用于我的第二个建议。
发布于 2017-12-25 20:14:58
([1-9]\d{2,3})(?=_\d){x,y}将匹配从x到y乘以以前的模式,在本例中\d
编辑:从你自己的正则表达式看,它看起来像你想要的数字中以非零开头的部分。但是,由于您的示例包括领先的0,所以您可能真的想:
(\d{2,3})(?=_\d)它将给出下划线之前的最后3位数字,除非只有2位数字。
https://stackoverflow.com/questions/47971712
复制相似问题