首先,我要说我是Regex和C#的新手,所以我仍在设法弄清楚这一点。我也意识到正则表达式是一门很深的主题,需要花费一些时间来理解。我做了一些研究来弄清楚这一点,但是我没有时间去适当地研究Regex语法的技巧,因为我需要明天完成此程序。(不,这不是作业,是为了我的工作)
我正在使用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”不匹配)时。连字符的两边应始终为两位数。
这个正则表达式(我唯一可以匹配的东西)可以工作,但也可以拾取必要范围之外的项目:
Regex regExPattern = new Regex(@"\s" + month + @"-\d{2}\s");
我也尝试了这个没有成功:
Regex regExPattern = new Regex(@"\s" + month + @"-\d[01-30]{2}\s");
谁能告诉我我需要更改以获得所需的结果吗?提前致谢。
如果您只需要查找行中是否包含任何有效匹配项,则可以执行以下操作:
private bool CheckTransactionDates(string line)
{
// in the actual code this is dynamically set based on other variables
int month = DateTime.Now.Month;
int daysInMonth = DateTime.DaysInMonth(DateTime.Today.Year, DateTime.Today.Month);
Regex pattern = new Regex(string.Format(@"{0:00}-(?<DAY>[0123][0-9])", month));
int day = 0;
foreach (Match match in pattern.Matches(line))
{
if (int.TryParse(match.Groups["DAY"].Value, out day))
{
if (day <= daysInMonth)
{
return true;
}
}
}
return false;
}
运作方式如下:
您确定要搜索的月份(此处使用当前月份),以及该月份的天数。
接下来,使用string.Format函数构建正则表达式模式,该函数将左填充零的月份放在其后,然后是破折号,后跟任意两位数字00到39([0123]
第一个数字[0-9]
为the,第二个数字为)。这会缩小正则表达式的匹配范围,但不能最终确定日期。在(?<DAY>...)
它周围创建一个正则表达式组,这将使得处理它以后更容易。请注意,如果行以有效日期开头,则我不会检查空格。您可以轻松地在模式中添加空格,或根据您的特定需求修改模式。
接下来,我们pattern.Matches
循环检查该行()上所有可能的匹配项。
如果找到匹配项,则我们尝试将其解析为整数(根据我们匹配的模式,它应始终有效)。我们使用DAY
在模式中定义的匹配组。
将匹配项解析为整数后day
,我们检查该天是否是指定月份的有效数字。如果是,我们从函数中返回true,因为我们找到了有效日期。
最后,如果没有找到匹配项,或者没有匹配项有效,则从函数中返回false(仅当我们之前未返回true时)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句