【问题标题】:Regex.IsMatch returns two different output in C#Regex.IsMatch 在 C# 中返回两个不同的输出
【发布时间】:2017-05-02 19:43:54
【问题描述】:

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

RegExMatch 是我的curSetting 对象的正则表达式成员。我的测试数据是 Pattern is

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

字符串是1_GeneralLog1370013-170403.log

【问题讨论】:

  • 请分享完整的相关代码。 curSetting.RegExMatch 模式是什么? filename 的价值是什么?
  • 当您发布您正在搜索的模式和文本时会有所帮助。也许这会对您有所帮助Regular Expression working in regex tester, but not in c#
  • RegExMatch 是什么类型?没听说过。
  • RegExMatch 是我的 curSetting 对象的正则表达式成员。我的测试数据是 Pattern is Gen(?!.*(?:erallog))(?&lt;SerialNo&gt;.+?)-(?&lt;Year&gt;(?:\d{2}))(?&lt;Month&gt;\d{2})(?&lt;Day&gt;\d{2})(?&lt;Other&gt;.*?\.log) string is 1_GeneralLog1370013-170403.log
  • I get true for both cases。你的curSetting.RegExMatch 编译的标志是什么?我猜你用过Regex.IgnoreCase。那么,你现在想要什么?

标签: c# regex


【解决方案1】:

很明显,您的 curSetting.RegExMatch 是使用 RegexOptions.IgnoreCase 标志编译的:(?!.*(?:erallog)) 不区分大小写并与您的 1_GeneralLog1370013-170403.log 输入字符串中的 eralLog 匹配,因此负前瞻模式会找到匹配并在整体匹配中失败。

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

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

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

【讨论】:

    猜你喜欢
    • 2020-01-19
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2015-05-04
    相关资源
    最近更新 更多