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
,但也可以轻松匹配结尾 cccc
、ksid
、scss
等。
试试这个:
(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# 正则表达式 - 似乎无法始终如一地工作的主要内容,如果未能解决你的问题,请参考以下文章