正则表达式可以匹配吗?

Regex is possible to match?

我有这些文件名的文件:

ZATR0008_2018.pdf
ZATR0018_2018.pdf
ZATR0218_2018.pdf

其中ZATR后4位为杂志期号

使用这个正则表达式:

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

我可以提取 818218,但我想保留最少 2 位数字和最多 3 位数字,因此结果应该是 0818218.

这怎么可能?

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

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

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

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

下划线前的最后 3 位数字,除非只有 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 个数字。

我建议你:

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

演示代码here。结果:

Match 1 Full match 0-17 ZATR0008_2018.pdf Group 1. 6-8 08

Match 2 Full match 18-35 ZATR0018_2018.pdf Group 1. 24-26 18

Match 3 Full match 36-53 ZATR0218_2018.pdf Group 1. 41-44 218

(?:[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 库,你在另一个答案中提到的似乎并没有在必要时回溯到我的第一个建议中的 (?:)?,这使得它非常与我之前遇到的任何正则表达式引擎不同,它更喜欢只匹配 21818,即使它在字符串的后面开始。但它确实适用于我的第二个建议。