Regex无法在C#中准确捕获结果,但在在线正则表达式工具上运行良好

时间:2017-01-12 11:53:07

标签: c# regex

此正则表达式 - (.*).ap(.\d*)$ - 适用于在线正则表达式工具(例如,工作here),但不适用于C#。

意图是对于以.ap<some numbner>.ap后跟一些数字 - .ap1,.ap123等)结尾的字符串,我们想要捕获最后一个{{1}左边的所有内容。 1}}以及最后.ap右侧的所有内容。例如,对于.ap,我们想要捕获abcfile.csv.ap123abcfile.csv

123按照预期在在线工具中捕获这两个组,但在C#中,它捕获整个名称(在上面的示例中捕获abcfile.csv.ap123)。

C#代码是 -

(.*).ap(.\d*)$

match.Success为true但match.Captures.Count为1且match.Captures [0] .Value包含整个文件名(我在手表中看着这个)。

这里可能有什么问题?

更多示例 -

  • TestCashFile_10_12-25-2016_D.csv - 不匹配
  • TestCashFile_10_12-25-2016_D_A.csv.ap123 - 应匹配并捕获TestCashFile_10_12-25-2016_D_A.csv和123
  • TestCashFile_10_12-25-2016_D_A.csv.ap123.ds - 不应该匹配
  • TestCashFile_10_12-25-2016_D.csv.ap2.ap1 - 应匹配并捕获TestCashFile_10_12-25-2016_D.csv.ap2和1

2 个答案:

答案 0 :(得分:5)

您的代码很好

enter image description here

只需尝试match.Groups[1]match.Groups[2]

在0索引中,您具有完全匹配,并且只有后续组与正则表达式组相关。

答案 1 :(得分:1)

看起来有效:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

namespace ConsoleApplication42
{
    class Program
    {
        static void Main(string[] args)
        {
            string[] filenames = { 
               "TestCashFile_10_12-25-2016_D.csv", // - Shouldn't match
               "TestCashFile_10_12-25-2016_D_A.csv.ap123", // - Should match and capture TestCashFile_10_12-25-2016_D_A.csv and 123
               "TestCashFile_10_12-25-2016_D_A.csv.ap123.ds", // - Shouldn't match
               "TestCashFile_10_12-25-2016_D.csv.ap2.ap1" //- Should match and capture TestCashFile_10_12-25-2016_D.csv.ap2 and 1
                             };

            string renameSuffix = "ap";
            string pattern = @"(?'filename'.*)\." + renameSuffix + @"(?'suffix'\d*)$";

            foreach (string filename in filenames)
            {
                Match match = Regex.Match(filename, pattern);
                Console.WriteLine("Match : {0}, Filename : {1}, Suffix : {2}", match.Success ? "True" : "False", match.Groups["filename"].Value, match.Groups["suffix"].Value);
            }
            Console.ReadLine();
        }
    }
}