首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Regex可以匹配吗?

Regex可以匹配吗?
EN

Stack Overflow用户
提问于 2017-12-25 20:10:55
回答 4查看 63关注 0票数 0

我有这些文件名:

代码语言:javascript
复制
ZATR0008_2018.pdf
ZATR0018_2018.pdf
ZATR0218_2018.pdf

其中ZATR后面的4位数字是杂志的发行号。

用这个正则表达式:

代码语言:javascript
复制
([1-9][0-9]*)(?=_\d)

我可以提取818218,但是我想保留最少2位和最大3位,所以结果应该是0818218

怎么可能这样做呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-12-25 20:35:00

你可以用

代码语言:javascript
复制
0*(\d{2,3})_\d

拿走第一组的价值。见regex演示

详细信息

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

下面是一个PCRE变体,它将所需的值获取到一个完整的匹配中:

代码语言:javascript
复制
0*\K\d{2,3}(?=_\d)

请参阅另一个regex演示

在这里,\K让regex引擎省略到目前为止匹配的文本(零),然后匹配2到3位数字,后面跟着_和一个数字。

票数 2
EN

Stack Overflow用户

发布于 2017-12-25 21:34:13

代码语言:javascript
复制
(?:[1-9][0-9]?)?[0-9]{2}(?=_[0-9])

或者也许:

代码语言:javascript
复制
(?:[1-9][0-9]+|[0-9]{2})(?=_[0-9])

(您在另一个答案中提到的https://www.freeformatter.com/regex-tester.html,它声称使用了XRegExp库,在必要时我的第一个建议似乎并没有回溯到(?:)?中,这使得它与我以前封装的任何regex引擎都有很大的不同,并且使得它更倾向于只匹配18 of 218,即使它在字符串的后面开始。但这确实适用于我的第二个建议。

票数 1
EN

Stack Overflow用户

发布于 2017-12-25 20:14:58

代码语言:javascript
复制
([1-9]\d{2,3})(?=_\d)

{x,y}将匹配从x到y乘以以前的模式,在本例中\d

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

代码语言:javascript
复制
   (\d{2,3})(?=_\d)

它将给出下划线之前的最后3位数字,除非只有2位数字。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47971712

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档