【发布时间】:2013-12-31 17:54:42
【问题描述】:
让我先说我是 Regex 和 C# 的新手,所以我仍在努力解决这个问题。我也意识到正则表达式是一个需要时间来理解的深层次的主题。我做了一些研究来弄清楚这一点,但我没有时间正确研究正则表达式语法的艺术,因为我需要明天完成这个程序。 (不,这不是作业,这是为了我的工作)
我正在使用 c# 逐行搜索文本文件,并尝试使用 Regex 表达式检查是否有任何行包含格式为 MM-DD 的当前月份的任何日期。 Regex 表达式在传递文件每一行的方法中使用。
这是我目前使用的方法:
private bool CheckTransactionDates(string line)
{
// in the actual code this is dynamically set based on other variables
string month = "12";
Regex regExPattern = new Regex(@"\s" + month + @"-\d(0[1-9]|[1-2][0-9]|3[0-1])\s");
Match match = regExPattern.Match(line);
return match.Success;
}
如果它前面有一个空格,后面有一个空格,基本上我需要它来匹配。仅当它是当前月份(在本例中为 12)、连字符和月份中的某一天(“ 12-01 ”应匹配但不匹配“ 12-99 ”)时。连字符两侧应始终为 2 位数字。
这个正则表达式(我唯一能匹配的东西)会起作用,但也会挑选必要范围之外的项目:
Regex regExPattern = new Regex(@"\s" + month + @"-\d{2}\s");
我也试过这个没有成功:
Regex regExPattern = new Regex(@"\s" + month + @"-\d[01-30]{2}\s");
谁能告诉我我需要改变什么才能得到我需要的结果? 提前致谢。
【问题讨论】:
-
您说像
\s12-\d{2}\s这样的模式匹配您不想要的其他项目,请提供它匹配的文本示例。显然,我们在这里是盲目的,因为我们不知道 Regex 失败的示例文件可能是什么样子。 -
我不明白为什么只匹配有效的日期范围如此重要。如果您真的担心可能存在无效值,您可以在第二步中对其进行验证。有效日期取决于月份,因此仅使用正则表达式进行此验证很困难。
-
看看这里:Regular Expression to match valid dates 或 LMGTFY。让正则表达式专门匹配可能既困难又丑陋,但您可以使用正则表达式缩小范围并检查范围。
-
@Michael Perrenoud 它匹配的行的一个示例是:“ 11-20 2690 E 28.76 12-02 2468 E* 387.85” 但是它也会匹配这一行(我不希望它匹配匹配):“ 11-15 3610 E 29.34 12-87 2534 E* 465.85”
-
你不能用
DateTime.TryParseExtact吗?