【问题标题】:Match all except specific group匹配除特定组以外的所有组
【发布时间】:2020-01-02 15:25:21
【问题描述】:

我有一个测试字符串 repo-2019-12-31-14-30-11.gz,我想从该字符串中排除 2019-12-31-14-30-11.gz 并匹配其他所有内容。日期和小时的数字可以不同。文本开头的字符串可以是任何单词,可以包含数字、破折号或下划线。常量字符是:

  • 回购名称和日期之间的破折号
  • .gz 在文末

我尝试了以下正则表达式:

^.*(?!-\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}.gz$)

但它总是匹配整个文本

【问题讨论】:

  • Digits with date and hour can be different. 是什么意思?格式可以与您当前匹配的格式不同吗?如果是这样,你能用可能的格式更新问题吗?
  • 不,格式始终相同,但日期可以不同。
  • 你测试过这些模式吗?工具或语言是什么?
  • 你是这个意思吗? echo "repo-2019-12-31-14-30-11.gz" | sed -En 's/^([[:alnum:]-]+)-[[:digit:]]{4}-[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2}-[[:digit:]]{2}\.gz$/\1/p'
  • 是的! thx :D 我不知道为什么 sed 不能使用正确的正则表达式语法

标签: regex


【解决方案1】:

您尝试的模式^.*(?!-\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}.gz$) 始终匹配整个文本,因为.* 将首先匹配到字符串的末尾。然后在字符串的末尾,它会断言直接在右边的不是日期之类的模式。

该断言将成功,因为它位于字符串的末尾。


您可以使用具有匹配单词字符或连字符的字符类的捕获组,并在替换中使用它:

^([\w-]+)-\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}\.gz$

Regex demo

如果开头不能下划线开头且不能包含连续的下划线,则可以在分组结构中重复匹配连字符和单词字符\w+(?:-\w+)*

^(\w+(?:-\w+)*)-\d{4}-\d{2}-\d{2}-\d{2}-\d{2}-\d{2}\.gz$

Regex demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    相关资源
    最近更新 更多