Построение шаблона Regex для выбора желаемого текста из данных - PullRequest
2 голосов
/ 08 мая 2020

Я получаю некоторые текстовые данные из TextArea в пользовательском интерфейсе моего приложения. Конечная цель - распознать заранее определенный формат / образец текста из всех данных TextArea. (В дальнейшем я буду использовать такой отфильтрованный текст, если таковой имеется, для дальнейшей обработки идентификаторов сотрудников из такого текста)

Допустимые шаблоны:

  1. EMP {и любые допустимые ID здесь}. Например, EMP 1234
  2. URL с этим фиксированным шаблоном: http://emps/ {id} Например, http://emps/1234

I буду искать такой шаблонный текст из исходных данных.

Вот набор шаблонов регулярных выражений и связанных логических выражений c, которые я разработал до сих пор:

string sourceText = "This will contain a bunch of text. Might also contain EMP 1234 and there could be a bunch of text after this pattern. There could again be EMP 4567 or http://emps/2345 We'll be extracting all such patterns. 3 in this case." 
const string regexPattern =
    "(\\bEMP(s|(id)|:|#)?\\s*?(id|#)?\\s*?(:|#)?\\s{1})(?<EMPid>(\\d{1,11}))(\\s*?(,|(and))\\s*?(?<EMPidnew>(\\d{1,11})))*";

var search = new Regex(regexPattern , RegexOptions.IgnoreCase);

MatchCollection matches = searcher.Matches(sourceText );

foreach (Match match in matches)
{
    //If we reach this point it means that the sourceText contained text which matched our pattern
    // From this point I'll be extracting the ID and process it further
}

REGEX - это без учета регистра, как и предполагалось. REGEX, который я разработал до сих пор, используя синтаксические ссылки с некоторых веб-сайтов, правильно обрабатывает мой первый шаблон, например:

  • EMP {и любой действительный идентификатор здесь}. Например, EMP 1234

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

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Из того, что я вижу, простое совпадение последовательных цифр (двух или более) выполнит работу \d{2,}.

Используя ваш пример, вот что захватывается в 3 отдельные совпадения ( в золоте ):

Three Matches on \d{2,}

Конечно, вы можете улучшить logi c, зная, что как минимум Номер сотрудника состоит из 4 цифр, поэтому используйте \d{4,}.

Начинаются ли они с определенного числа c, скажем 9?, А затем добавляют это, например, 9\d{3,}.


Нужен префикс Emp или он URL? Затем создайте из этого шаблона (EMP\s|/), где мы ищем emp или прямой sla sh URL-адреса. Например, ((EMP\s|/)\d{2,})

enter image description here


Дело в том, что вы можете опираться на основные c принципы, чтобы найти совпадение. Если нужен весь URL-адрес, добавьте его к указанным выше стандартным блокам.

1 голос
/ 08 мая 2020

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

Пояснение

  • \b Граница слова
  • (?: Группа без захвата для чередования
    • EMP Буквальное соответствие
    • (?:id|[s:#])? Необязательно сопоставление либо id, либо одного из s : или #
    • \s+ Соответствует 1+ пробелам
    • (?<EMPid>\d{1,11}) Именованная группа EMPid , соответствует 1-11 цифрам
    • | Или
    • (?<EMPurl>https?://emps/\d+) Именованная группа EMPurl Соответствует шаблону URL
  • ) Закрыть группу без захвата
  • (?!\S) Отрицательный просмотр вперед, утверждение, что то, что справа, не является символом без пробелов (граница пробела справа)

Regex demo | C# демо

Пример кода

string sourceText = "This will contain a bunch of text. Might also contain EMP 1234 and there could be a bunch of text after this pattern. There could again be EMP 4567 or http://emps/2345 We'll be extracting all such patterns. 3 in this case.";
const string regexPattern = @"\b(?:EMP(?:id|[s:#])?\s+(?<EMPid>\d{1,11})|(?<EMPurl>https?://emps/\d+))(?!\S)";
var search = new Regex(regexPattern , RegexOptions.IgnoreCase);
MatchCollection matches = search.Matches(sourceText);

foreach (Match match in matches)
{
    Console.WriteLine(match.Value.ToString());
}

Выход

EMP 1234
EMP 4567
http://emps/2345
1 голос
/ 08 мая 2020

Допустимые шаблоны:

  1. EMP {и любой действительный идентификатор здесь}. Например, EMP 1234
  2. URL с фиксированным шаблоном: http://emps/ {id} Например, http://emps/1234

Глядя на ваше регулярное выражение в коде, вы видите, что вы хотите go способ сверх того, что вы говорите в цитате. Для регулярного выражения я бы просто использовал:

(https?://emps/|\bEMP\b\s*)(?<EMPid>\d{1,11})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...