【问题标题】:Regex filename matching with a delimiter正则表达式文件名与分隔符匹配
【发布时间】:2015-08-04 04:01:18
【问题描述】:

我需要使用正则表达式从以下目录路径中提取主机名。基本上是host1、host2、host3、host4、host5和host 6。

/opt/var/logs/2015/08/04/03/host1_syslog.log
/opt/var/logs/2015/08/04/03/host2_syslog.log
/opt/var/logs/2015/08/04/03/host3_syslog.log
/opt/var/logs/2015/08/04/03/host4_applog.log
/opt/var/logs/2015/08/04/03/host5_applog.log
/opt/var/logs/2015/08/04/03/host6_applog.log

解决这个问题,我已经设法匹配没有扩展名的文件名:

([^\/]+)(?=\.\w+$)

即。 host1_syslog

但不是主机名:

即。 主机1

在遇到下划线字符_后,我无法弄清楚如何停止匹配。

谢谢。

【问题讨论】:

  • 你使用什么语言?

标签: regex


【解决方案1】:
([^\/]+)(?=_[a-zA-Z0-9]+\.\w+$)

你可以使用这个。在lookahead下明确添加_[a-zA-Z0-9]+

查看演示。

https://regex101.com/r/fM9lY3/11

【讨论】:

    【解决方案2】:

    这匹配在最后一个斜线到下划线之后:

    (?<=\/)(?!.*\/)[^_]+
    

    整个匹配是主机名(不需要组)。

    live demo

    【讨论】:

      【解决方案3】:

      编辑 2:

      我认为这可能可行——贪婪地处理直到最后一个斜线(包括最后一个斜线)的所有内容,然后捕获所有内容,直到下划线:

        '.*/([^_]+)'
      

      编辑3:(添加Python re示例)

      >>> import re
      >>> print re.compile('.*/([^_]+)').search('/opt/var/logs/2015/08/04/03/host1_syslog.log').groups()
      ('host1',)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多