Не могу понять достаточно простой фрагмент кода в C#, используя RegexClass r = new Regex ("|, |,"); - PullRequest
1 голос
/ 21 января 2020

У меня проблемы с некоторым кодом, который должен быть простым.

namespace CSharp
{
    using System;
    using System.Text;
    using System.Text.RegularExpressions;

    public class Tester
    {
        static void Main()
        {
            string s1 = "One,Two,Three Liberty Associates, Inc.";
            Regex theRegex = new Regex(" |, |,");
            StringBuilder sBuilder = new StringBuilder();
            int id = 1;
            foreach (string subString in theRegex.Split(s1))
            {
                sBuilder.AppendFormat("{0}: {1}\n", id++, subString);
            }
            Console.WriteLine("{0}", sBuilder);
        }
    }//tester class
}//namespace

Что выводит:

1: One
2: Two
3: Three
4: Liberty
5: Associates
6: Inc.

Если я изменю вызов конструктора для нового Regex ("|,") ; Я получаю:

1: One,Two,Three
2: Liberty
3: Associates
4: Inc.

Я знаю | есть или, и я разбираю, и пробел, но я не понимаю, как это работает, и почему мне нужно, чтобы его дали дважды.

Ответы [ 4 ]

0 голосов
/ 23 января 2020

хорошо, так как работает следующее?

 Regex theReg = new Regex(@"(?<time>(\d|\:)+)\s" + @"(?<ip>(\d|\.)+)\s" +
                             @"(?<site>\S+)");

@ "(? (\ D |:) +) \ s" - должно означать группу с именем time, имеющую любую комбинацию чисел и: двоеточия правильно? @ "(? (\ d |.) +) \ s" - группа с именем IP, которая имеет цифры или точки в любом количестве

@ "(? \ S +)") - группа символов

А то, как этот Regex предназначен для работы, работает только парами по 3 или? сделал несколько тестов с этим, это то, что я понимаю.

0 голосов
/ 21 января 2020

У второго регулярного выражения есть пробел ИЛИ запятая-плюс-пробел. Строка «Один, Два, Три» не имеет пробелов, поэтому не соответствует ни одной части этого регулярного выражения. Чтобы лучше увидеть, что происходит, попробуйте Regex("( |, |,)") и Regex("( |, )"). Добавление скобок в регулярные выражения добавляет текст, который они соответствуют, в результаты. См. здесь , в котором говорится:

Если в выражении Regex.Split используются скобки с захватом, любой захваченный текст включается в результирующий массив строк. Например, если вы разбили строку «сливовая груша» на дефис, помещенный в скобки захвата, возвращаемый массив содержит строковый элемент, содержащий дефис.

Кроме того, я предлагаю изменить

sBuilder.AppendFormat("{0}: {1}\n", id++, subString);

должно быть

sBuilder.AppendFormat("{0}: '{1}'\n", id++, subString);

Заключение в кавычки {1} облегчает просмотр строки, особенно если она имеет начальные или конечные пробелы.

0 голосов
/ 21 января 2020

Ваше первое регулярное выражение "|, |," разделяет текст на три опции:

  • один пробел ('')
  • одна запятая (',')
  • одна запятая и один пробел (',')

Второе регулярное выражение "|," имеет только две опции:

  • один пробел ('')
  • одна запятая и один пробел (',')

Разделение запятой не существует, поэтому оно не разделяет "Раз, два, три".

Я предлагаю изменить ' ' на \s, и вы можете взять два варианта ',' и ', ' с этим кодом: ',\s?' - одна запятая, а затем один или ноль пробелов.

Так что полное регулярное выражение: "\s|,\s?"

вы можете проверить это здесь: регулярное выражение

0 голосов
/ 21 января 2020

Вы можете думать о "|" как или Итак, при разборе этого регулярного выражения вы найдете все совпадения с этим шаблоном: "" ИЛИ "," ИЛИ ",".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...