Skip to main content
 首页 » 编程设计

c#之年份无法使用正则表达式正确显示

2024年02月06日26grandyang

使用正则表达式匹配这行文本我发现年份仍然显示为 2015-01-07 而不仅仅是 2015。谁能看出我的正则表达式有什么问题?

代码行:

    2015-01-07 Wed Jan 07 11:03:43.390 DD Started 

我的正则表达式:

    (?<date>(?<year>(?:\d{4}|\d{2})-(?<month>\d{1,2})-(?<day>\d{1,2})))\s(?<logEntry1>.*)\s(?<logEntry2>.*)\s(?<logEntry3>.*)\s(?<time>(?<hour>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2}).(?<milli>\d{0,3}))\s(?<logEntry>.*) 

为什么我不能挑出“年份”? 我通过 regex101.com 运行它,这里是捕获组值:

    MATCH 1 
    date    [0-10]  `2015-01-07` 
    year    [0-10]  `2015-01-07` 
    month   [5-7]   `01` 
    day [8-10]  `07` 
    logEntry1   [11-14] `Wed` 
    logEntry2   [15-18] `Jan` 
    logEntry3   [19-21] `07` 
    time    [22-34] `11:03:43.390` 
    hour    [22-24] `11` 
    minutes [25-27] `03` 
    seconds [28-30] `43` 
    milli   [31-34] `390` 
    logEntry    [35-45] `DD Started` 

请您参考如下方法:

您应该将括号从 ))) 移至 (?:\d{4}|\d{2})):

(?<date>(?<year>(?:\d{4}|\d{2}))-(?<month>\d{1,2})-(?<day>\d{1,2}))\s(?<logEntry1>.*)\s(?<logEntry2>.*)\s(?<logEntry3>.*)\s(?<time>(?<hour>\d{2}):(?<minutes>\d{2}):(?<seconds>\d{2}).(?<milli>\d{0,3}))\s(?<logEntry>.*) 

实际上,我宁愿对这么长的正则表达式使用 VERBOSE 正则表达式选项,并使用像 # Year 这样的注释来跟踪你的内容:

var rx = new Regex(@"(?<date> 
     (?<year> 
       (?:\d{4}|\d{2}) 
     )                  # Year 
     - 
     (?<month>\d{1,2}) 
     - 
     (?<day>\d{1,2}) 
   )                    # Date 
   \s 
   (?<logEntry1>.*) 
   \s 
   (?<logEntry2>.*) 
   \s 
   (?<logEntry3>.*) 
   \s 
   (?<time> 
     (?<hour>\d{2}) 
     : 
     (?<minutes>\d{2}) 
     : 
     (?<seconds>\d{2}) 
     . 
     (?<milli>\d{0,3}) 
   ) 
   \s 
   (?<logEntry>.*)", RegexOptions.IgnorePatternWhitespace); 

结果: