Не удается заставить Regex тянуть мм / дд / гггг в c # - PullRequest
0 голосов
/ 29 августа 2018

Я работаю над анализом большой строки, и все работает, кроме перехвата даты.

Я попытался поместить следующее в круглые скобки Group3 на рисунке, а затем я потерял все группы, включая Group1 и Group2, которые работали:

^\d{1,2}/\d{1,2}/\d{4}$

/^\d{1,2}\/\d{1,2}\/\d{4}$/

/^(0[1-9]|1[0-2])\/(0[1-9]|1\d|2\d|3[01])\/(19|20)\d{2}$/

^((0|1)\d{1})-((0|1|2)\d{1})-((19|20)\d{2})

Лучший рабочий Regex (получает штрафы для Group1 и Group2):

((?:[a-zA-Z'-]+[^a-zA-Z'-]+){0,2})assigned by((?:[^a-zA-Z'-]+[a-zA-Z'-]+){0,2}) on ()

И образец данных: "# 1 xxxxx xxxxx, назначенный Alex xxxxx 08/10/2018, запрос представлен xxxxx 08/10/2018, запрос создан xxxxx Olander 08/10/2018 Отправлено: 1 "

Примечание: запятая после даты не всегда будет там.

enter image description here

1 Ответ

0 голосов
/ 29 августа 2018

В шаблонах регулярных выражений старайтесь не избегать попыток сопоставить все, что есть, создавая наборы вещей, если они не нужны, но найдите якоря и используйте общее сопоставление с образцом, чтобы найти то, что нужно ..

Следующие будут использовать якоря #1, submitted by и [sp]on[sp], а затем мы сделаем общее извлечение вокруг этого. Наконец, базовый шаблон даты будет использоваться для получения даты. Обратите внимание, что я использую именованные захваты группы, чтобы упростить извлечение.

string data = "#1 xxxxx xxxxx assigned by Alex xxxxx on 08/10/2018,Request submitted by xxxxx on 08/10/2018,Request created by xxxxx Olander on 08/10/2018 Mailed: 1";

string pattern = @"
\#\d+\s+                      # Anchor for the #
(?<Person1>.+?)               # Match Person 1
(?=\sassigned\s)              # Look Ahead for assigned
\sassigned\sby\s              # Consume but don't match assigned
(?<Person2>.+?)               # Match person 2
(?=\son\s)                    # LA for son
\son\s                        # consume
(?<Date>\d\d\D\d\d\D\d\d\d\d) #Get date
";

Regex.Matches(data, pattern, RegexOptions.IgnorePatternWhitespace)
     .OfType<Match>()
     .Select(mt => new {
                         P1 = mt.Groups["Person1"].Value,
                         P2 = mt.Groups["Person2"].Value,
                         DTE = mt.Groups["Date"].Value,
                       } )

В результате получается список из одного предмета, я полагаю, у вас есть несколько снимков.

enter image description here

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