【问题标题】:4 digts only regex pattern/group matches dates and slashes仅 4 位正则表达式模式/组匹配日期和斜线
【发布时间】: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

标签: c# .net regex


【解决方案1】:

正如FLydog57 的评论中所说,这里我们只想要开始和结束锚点,这可能会解决我们的问题:

^[0-9]{4}$
^\d{4}$

Demo

测试

using System;
using System.Text.RegularExpressions;

public class Example
{
    public static void Main()
    {
        string pattern = @"^[0-9]{4}$";
        string input = @"6319
4/22/2017 6:28:17 PM
2016 MALAWI SCHOOL CERTIFICATE OF EDUCATION EXAMINATIONS
2016";
        RegexOptions options = RegexOptions.Multiline;

        foreach (Match m in Regex.Matches(input, pattern, options))
        {
            Console.WriteLine("'{0}' found at index {1}.", m.Value, m.Index);
        }
    }
}

Please see the c# demo here.

【讨论】:

  • 可以使用"(?m)^[0-9]{4}$" 代替options ?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多