使用Regex.Split按日期拆分字符串失败,寻求解决方案
问题分析与解决方案
我一眼就看出问题出在哪了——你的正则表达式用了^和$这两个锚点符号,它们分别代表整个字符串的开头和整个字符串的结尾。也就是说,你的正则是在找“整个字符串就是一个日期”的情况,但你要处理的原文本里,日期只是其中的一部分,根本不是整个字符串,所以这个正则完全匹配不到任何内容,Regex.Split自然就返回原字符串了。
修正后的代码
把正则里的^和$去掉,让它匹配字符串中任意位置的日期格式就行:
string input = "SEND MILK EVERYDAY FOR THIS PERSON FROM 02/10/2014 TO 02/11/2014 SKIP 03/11/2014 AND 09/11/2014"; // 保留日期作为拆分结果的一部分(因为正则里有捕获组) string[] split = Regex.Split(input, @"(0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}");
如果你不想把日期包含在拆分后的结果里,可以把正则改成非捕获组(用(?:...)包裹):
// 拆分后只保留日期前后的文本片段 string[] split = Regex.Split(input, @"(?:0?[1-9]|[12][0-9]|3[01])[\/\-](0?[1-9]|1[012])[\/\-]\d{4}");
效果示例
用第一个代码拆分后,结果会是这样的片段集合:
- "SEND MILK EVERYDAY FOR THIS PERSON FROM "
- "02/10/2014"
- " TO "
- "02/11/2014"
- " SKIP "
- "03/11/2014"
- " AND "
- "09/11/2014"
如果需要更精细的拆分逻辑(比如只在日期的前后空白处拆分),还可以给正则加上空白匹配,比如\s+(日期正则)\s+,但目前这个修改已经能解决你最核心的问题了。
内容的提问来源于stack exchange,提问作者Anish Sivadas
相关产品推荐
相关产品推荐

