【问题标题】:C# Lazy Regular Expression MatchingC# 惰性正则表达式匹配
【发布时间】:2009-11-17 21:35:23
【问题描述】:

我有一堆需要解析的文件,它们的文件名中都有两个日期模式之一(我们正在升级我们的系统,我们需要让文件解析器能够识别这两个日期格式,新旧)。

文件名看起来像<fileroot>_yyyyMMdd.log<fileroot>_MMddyy.log,我需要能够解析出数字来解析日期,但是,每当我尝试使用像^.*(\\d{6,8}).*$^.*(\\d{6}|\\d{8}).*$ 这样的正则表达式时为了解析出日期的数字,捕获组的长度始终为 6 个字符,即使对于 8 位的文件名也是如此。

有什么方法可以强制 C# 中的正则表达式库在尝试匹配正则表达式时尽可能详尽?我知道如何在 Java 中做到这一点,而不是 C# / .NET,我对这门语言还很陌生。

【问题讨论】:

    标签: c# regex regex-greedy


    【解决方案1】:

    问题出在这里:“.*”。正则表达式是贪婪的,所以它匹配尽可能多的符号。包括前两位数

    解决方案:

    1) .*_(\\d{6,8}) - 如果你的数字前总是有 _

    2).*[^\\d](\\d{6,8})

    3).*?(\\d{6,8})

    您在 Java 中也会遇到同样的问题,Regex 到处都是贪婪的。

    【讨论】:

      【解决方案2】:

      如果您知道日期后面总是跟一个已知字符串,我会更改正则表达式以强制匹配该字符串:

      ^.*(\\d{6,8})\.log$
      

      这将强制正则表达式引擎消耗所有 8 位数字以匹配尾随的 \.log

      【讨论】:

      • 试过了,不行。当与使用该正则表达式的 fileroot_20091117.log 进行比较时,.NET 正则表达式引擎的(显然是默认的)惰性匹配得到“091117”。
      猜你喜欢
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多