正则表达式非捕获组

时间:2016-05-30 05:11:36

标签: regex

这是我的正则表达式测试字符串,

DDD001_1_2016_6TP2_1

我需要在一个捕获组中捕获DDD001_1_20 16 _ 6TP2 _1并省略下划线。我已经尝试过以下正则表达式,即使是非捕获组,我仍然无法捕获我想要的内容。

^(.*?)_.*?_\d{2}(\d{2}(?:_).*)_.*$

根据我的研究,看起来不可能通过正则表达式省略特定捕获组中的字符,它必须通过步骤2完成,例如。代码

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:2)

简而言之:你做不到。匹配总是连续的,即使它包含零宽度断言的东西,如果你想要到达后一个字符,也无法匹配下一个字符。

但是,大多数正则表达式匹配是在更广泛的编程环境的上下文中执行的,您可以使用嵌套捕获组,后续正则表达式或手动操作来过滤最后一个下划线。

答案 1 :(得分:0)

你可以去:

(\d{2}_[a-z0-9]+)_\d+$

请参阅a demo on regex101.com(请注意不同的修饰符!)。

答案 2 :(得分:0)

@ZephyrPellerin所说的是正确的。

虽然不可能过滤掉下划线,但仍然可以在不同的匹配组中捕获您需要的内容,然后可以使用您使用的语言以任何方式访问它们。

这里是DEMO

我使用的正则表达式是:(?<=_\d{2})(.+)(?=_(.+)_)

此处下划线之前的部分在第一个括号中捕获,之后的部分在第二个括号中。然后,如果需要,可以将它们连接起来形成一个字符串。

希望这有帮助。