正则表达式:如何在捕获单个组时匹配整个字符串 [重复]

Posted

技术标签:

【中文标题】正则表达式:如何在捕获单个组时匹配整个字符串 [重复]【英文标题】:Regex: How to match entire string while capturing individual groups [duplicate] 【发布时间】:2019-11-01 10:45:17 【问题描述】:

我正在尝试使用正则表达式解析此文件名中的日期。

LBX845656_PayOnline_0528-20191429.txt.052819220054.bak

我遇到的问题是我需要正则表达式来匹配整个文件名,同时捕获一个包含日期的组。

我编写了这个正则表达式来捕获捕获组 1 中的日期:

([0-9]0,8(?=\.txt))

在线使用正则表达式测试器,这似乎从我正在寻找的文件名中捕获了正确的字符串,但我不知道如何让正则表达式匹配整个字符串。

这是我要返回的内容

FULL MATCH: LBX845656_PayOnline_0528-**20191429**.txt.052819220054.bak
CAPTURE GROUP 1: 20191429

提前感谢您的任何建议。

【问题讨论】:

\w+_\w+_\d+-([0-9]0,8(?=\.txt)).txt.\d+.bak 至少会匹配您当前拥有的内容。但不确定该字符串还有哪些其他变体 “匹配整个字符串”是什么意思? Is that OK for you? 如果要得到与[0-9]0,8(?=\.txt)匹配的字符串,不需要匹配整个字符串,只需要matcher.find() @WiktorStribiżew OP 说他们需要匹配整个字符串,如果匹配,则获取日期部分。这是 OP 的要求,而不是正则表达式引擎的要求。 Imo 你太早结束了讨论,而且你引用的问题没有涵盖那个具体的话题。 【参考方案1】:

我认为这是一个更简单的正则表达式,可以解决您的问题,假设日期始终为 8 位。

选项 1

如果您可以假设日期是文件名中唯一的 8 位字符串

^.*[^\d](\d8)[^\d].*$

选项 2

如果你想假设它前面有一个“-”并且有一个“.”之后

^.*-(\d8)\..*$

选项 3

如果你想假设它后面是 .txt

^.*(\d8)\.txt.*$

【讨论】:

顺便说一句,20191429 看起来不像日期,因为 14 和 29 对于月份都是无效的。在我看来,0528-20191429 是日期加上(可能)时间(2019 年 5 月 28 日下午 2:29) 感谢罗伯特的回答。嗯,是的,在发布后注意到了这一点。文件中的日期格式为“MMDD-YYYYMMSS”。但是我绝对可以使用您提供给我的东西,我以错误的方式思考正则表达式。再次感谢。

以上是关于正则表达式:如何在捕获单个组时匹配整个字符串 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式:匹配单个数字重复n次

正则表达式中的命名捕获组

正则表达式学习

如何在正则表达式中使用带有字符的“环视”来捕获整个字符串?

如何匹配而不是捕获正则表达式的一部分?

Perl 中的正则表达式组:如何从正则表达式组中捕获与字符串中出现的未知数量/多个/变量匹配的元素到数组中?