Я хочу построить регулярное выражение, которое возвращает мне конкретную строку - PullRequest
0 голосов
/ 26 июня 2019

У меня есть массив строк.Теперь мне нужно построить регулярное выражение, которое дает мне строку, которая начинается с одной буквы, затем \, затем 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);
            }

Iожидайте ответ.
"w: \ WES \ 1234" и "w: \ WES \ 4567"

Как изменить шаблон регулярных выражений, чтобы найти нужную для меня строку?

Редактировать Мой код после корректировок, предложенных Эндрю Мортоном:

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 голосов
/ 26 июня 2019

Вы не должны экранировать проверяемую строку (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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...