C# 正则表达式 - 似乎无法始终如一地工作

Posted

技术标签:

【中文标题】C# 正则表达式 - 似乎无法始终如一地工作【英文标题】:C# Regular Expression - Does not seem to work consistently 【发布时间】:2021-12-06 20:23:47 【问题描述】:

Microsoft .NET C# 正则表达式:

@"^(t4_(?:[a-zA-Z]5[0-9])_(?:2?[0-3]2|1?[0-9])[jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec]3(?:[0-9]4))_([0-9]4)_([0-9]4)_([comp|disk|scs])4\\b";

(我希望搜索的文件名一致命名如下:

TraceLog_somename_other.log          -- should not match
t4_systx2_03oct2021_0001_2359_comp   -- Match
t4_systx2_03oct2021_0001_2359_disk   -- Match
t4_systx2_03oct2021_0001_2359_scs    -- does not match

目标是通过特定文件名签名的文件的正则表达式“掩码”扫描目录。所有文件使用的签名相同。尝试匹配模式似乎是一种方法。

为什么这不起作用?如果有更好的方法来完成这个...谢谢分享?

谢谢!

蒂姆·P

【问题讨论】:

【参考方案1】:

我假设你在问为什么这不匹配:

t4_systx2_03oct2021_0001_2359_scs

问题在于您的正则表达式的这一部分:

([comp|disk|scs])4

这是在集合comp|disk|scs 中查找恰好出现四次的任意字符。这可能匹配结尾 comp,但也可以轻松匹配结尾 ccccksidscss 等。

试试这个:

(comp|disk|scs)

正如@41686d6564 在 cmets 中指出的那样,您使用匹配月份的模式也有同样的问题。代替[jan|feb|...]3,使用(jan|feb|...)

完整的正则表达式:

^(t4_(?:[a-zA-Z]5[0-9])_(?:2?[0-3]2|1?[0-9])(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)(?:[0-9]4))_([0-9]4)_([0-9]4)_(comp|disk|scs)\b

【讨论】:

[jan|feb|...] 也是如此。 有趣 - 我从 [jan|feb|...] 和 [comp | disk ... ] 仍然不匹配。您的评论澄清了正在发生的事情-这使我能够解决问题-谢谢!我更改了表达式,现在字符串正确匹配 3 和 4 alpha 模式:^(t4_(?:[a-zA-Z]5[0-9])_(?:2?[0-3]2|1?[0-9])[jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec]3(?:[0-9]4))_([0-9]4)_([0-9]4)_(?:([comp|disk]4)|([scs]3))\b 那个正则表达式对我来说仍然不正确。它将匹配aaa 之类的月份和ccc 之类的结尾(因为您使用的是[] 和])。这是你想要的吗? 这就是我最终得到的结果:'''@"^(t4_((?:[a-zA-Z]5[0-9]))_((? :2?[0-9]2|1?[0-9])[jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec]3(? :[0-9]4))_([0-9]4))_([0-9]4)_(?:([az]3)|([az ]4)|([az]5)|([az]6)|([az]7)|([az]8)|([az]9) )\b";''' -- 第 6 组中的匹配可能是 3-9 个字符的任何字母组合。正则表达式似乎适用于我测试的所有情况......对于你的问题,需要模式匹配的日期格式是 nnmmmYYYY - 虽然它是一团糟,但我不知道更好的方法来处理日期。谢谢!

以上是关于C# 正则表达式 - 似乎无法始终如一地工作的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# 的正则表达式匹配(简单??)正则表达式

无法让正则表达式在 c# 中提取 mm/dd/yyyy

如何将 C# 正则表达式转换为打字稿正则表达式?

PostgreSQL中的正则表达式无法按预期工作

正则表达式无法正常工作[关闭]

带有正则表达式的代码似乎无缘无故地结束