Regex.IsMatch在C#中返回两个不同的输出

时间:2017-05-02 10:11:09

标签: c# regex

我正在尝试使用Regex.IsMatch()找到字符串和模式之间的匹配。我构建了正则表达式并使用regex101.com对其进行了测试,它运行正常。现在的问题是 Regex.IsMatch(filename, curSetting.RegExMatch.ToString());返回true 对于相同的文件名,curSetting.RegExMatch.IsMatch(filename))返回false。有人可以解释这有什么不同,它们之间的区别是什么?

RegExMatchcurSetting对象的正则表达式成员。我的案例中的测试数据是Pattern is

Gen(?!.*(?:erallog))(?<SerialNo>.+?)-(?<Year>(?:\d{2}))(?<Month>\d{2})(?<Day>\d{‌2})(?<Other>.*?\.log‌)

字符串为1_GeneralLog1370013-170403.log

1 个答案:

答案 0 :(得分:2)

很明显,您的curSetting.RegExMatch编译时带有RegexOptions.IgnoreCase标记:(?!.*(?:erallog))处理不区分大小写并与eralLog中的1_GeneralLog1370013-170403.log匹配输入字符串,因此负前瞻模式找到匹配并且无法完成整体匹配。

所以,有两种方法(取决于你需要的):

  • 从正则表达式对象初始化或
  • 中删除RegexOptions.IgnoreCase
  • 将不区分大小写的内联选项(?i)添加到模式中:

    (?i)Gen(?!.*(?:erallog))(?<SerialNo>.+?)-(?<Year>(?:\d{2}))(?<Mo‌nth>\d{2})(?<Day>\d{2})(?<Other>.*?\.log)