【发布时间】:2019-06-23 17:36:28
【问题描述】:
我有一个用 c sharp 编写的程序,用于从包含检查结果的 CSV 文件中提取模式。匹配包含 4 位数字的中心数字的正则表达式之一是匹配带有斜线的其他字符串,即日期时间字符串。
用于 4 位数字的正则表达式以提取名为 centerNumber 的命名组:(?<centreNumber>[0-9]{4})。
记录模式后的匹配项包括:
matched centre number -> 6319
matched centre number -> 4/22/2017 6:28:17 PM
matched centre number -> 2016 MALAWI SCHOOL CERTIFICATE OF EDUCATION EXAMINATIONS
示例输入,按 CSV 逐行显示:
CENTRE NO: LIKOMA SECONDARY
CAND.ID
0035
4/22/2017 6:28:17 PM
CENTRE NO: LIKOMA SECONDARY
CAND.ID
5035
4/22/2017 6:28:17 PM
CENTRE NO: CHIFUNGA COMMUNITY
CAND.ID
0224
4/22/2017 6:28:46 PM
CENTRE NO: CHIKONDE COMMUNITY
CAND.ID
0238
4/22/2017 6:28:46 PM
上述示例输入的预期输出:
0035
5035
0224
0238
要访问命名组,我已将 Regex 加载到常量中:
StreamReader sr = new StreamReader(filepath);
while (!sr.EndOfStream)
{
var oneLine = sr.ReadLine();//read single line from csv
public const String REGEX_MSCE_CENTRE_NO = @"(?<centreNumber>[0-9]{4})";
Regex cNoRegex = new Regex(classes.AppConstants.REGEX_MSCE_CENTRE_NO, RegexOptions.Compiled | RegexOptions.IgnoreCase);
MatchCollection matches = cNoRegex.Matches(oneLine);
if (matches.Count == 1)
{
Console.WriteLine("matched centre number -> " + oneLine);
}
}
【问题讨论】:
-
您的正则表达式应该没问题,请发布您访问命名组的方式。
-
您可能在您显示的组周围有其他组 - 这不是您匹配为
的组...请显示您的问题的minimal reproducible example,包括数据、呼叫和打印这些结果。 -
您显示的每个字符串都有一个四位数的数字;这就是匹配。如果您只想匹配包含 4 位数字且只有 4 位数字的字符串,请在您的模式(括号外)前加上圆符(又名帽子 ('^')),并以美元符号 ('$ ')。它们代表字符串的开始和结束。
-
当您只匹配任意 4 个数字时,为什么要将您的捕获组命名为
centreNumber?为什么不把它命名为any4Numbers。