我想构建正则表达式,它可以返回特定的字符串

时间:2019-06-26 13:07:04

标签: regex c#-4.0

我有一个字符串数组。现在,我必须构建一个正则表达式,它给我一个字符串,该字符串以一个字母开头,然后是\,然后是4位数字。

我尝试了以下代码。

namespace ConsoleApplication 
{
    class Program 
    {
        static void Main(string[] args) 
        {
            string[] testStrings = new string[] { "w:\WES\1234", "w:\WES\4567", "w:\WES\856432", "w:\WES\AdK1234qw", "w:\WES\abcdesf};
            string RegEx = Regex.Escape("\b\d+\w*\b");

            foreach(var testString in testStrings) 
            {
                string f = Regex.Escape(testString );                   
                Match match = Regex.Match(f, @RegEx);             

                // Here we check the Match instance.
                if (!match.Success)
                {                 
                    continue;                      
                }
                console.writeline("teststringcorrect", match.value);
            }

我希望得到答案。
“ w:\ WES \ 1234”和“ w:\ WES \ 4567”

如何更改我的正则表达式模式以找到适合我的字符串?

编辑,我的代码经过Andrew Morton建议的调整后:

string root = @"C:emp\WES";  // Outputdebug: C:emp\WES
Regex re= new Regex("^" + Regex.Escape(root) + @"\\[0-9]{4}$");   // outputdebug: re.Pattern : ^C:emp\\WES\\[0-9]{4}$           
string[] subfolder = Directory.GetDirectories(root); // ouputdebug: {string[4]}. [0]:C:emp\WES\1234 [1]:C:emp\WES\5678 [3]:C:emp\WES\wqder [4]:C:emp\WES\60435632
var dirs = Directory.EnumerateDirectories(root).Where(d => re.IsMatch(d)); // outputdebug: {system.link.Enumerable.WhereEnumarableIteraTOR<STRING>} Current is Null
foreach (var folder in subfolder)
{
    string f = Regex.Escape(folder);
    Match match = re.Match(f);   // outputdebug: groups is 0           
                                    // Here we check the Match instance.
    if (!match.Success)
    {
        continue;
    }
}

1 个答案:

答案 0 :(得分:0)

您不得转义正在检查的字符串(testString),因为那样可以更改它。

您可以使用@符号使以下字符串成为文字(例如@"\r"将被视为反斜杠和r,而不是回车符)。即使这样,正则表达式中的文字反斜杠也必须转义为\\

要使用Console.WriteLine()输出多个字符串,必须将它们与+连接起来。

static void Main(string[] args)
{
    string[] testStrings = new string[] { @"w:\WES\1234", @"w:\WES\4567", @"w:\WES\856432", @"w:\WES\AdK1234qw", @"w:\WES\abcdesf"};
    Regex re =new Regex(@"^w:\\WES\\[0-9]{4}$");

    foreach (var testString in testStrings)
    {
        Match match = re.Match(testString);

        if (match.Success)
        {
                 Console.WriteLine("teststringcorrect " + match.Value);

        }
    }

    Console.ReadLine();

}

输出:

teststringcorrect w:\WES\1234
teststringcorrect w:\WES\4567

基于此,如果您有一个目录,并且想要查找名称恰好为四位数的子目录,则可以执行以下操作:

string root = @"C:\temp";
Regex re = new Regex("^" + Regex.Escape(root) + @"\\[0-9]{4}$");
var dirs = Directory.EnumerateDirectories(root).Where(d => re.IsMatch(d));

Console.WriteLine(string.Join("\r\n", dirs));

可能会输出

C:\temp\4321
C:\temp\9876