Как сделать ANDing условий в регулярном выражении? - PullRequest
1 голос
/ 23 октября 2009

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

Я хочу получить информацию о проекте, такую ​​как продолжительность проекта, клиент, используемые технологии и т. Д.

Итак, я хочу выбрать строку, начинающуюся со слова «проект», или строка может начинаться с других слов, таких как «детали проекта» или «детали проекта» или «проект № 1».

RegEx. сначала следует взглянуть на слово «проект» и выбирать строку только в том случае, если после слова «проект» найдено несколько или все из следующих слов.

     1) client
     2) duration
     3) environment 
     4) technologies  
     5) role

Я хочу выбрать строку, если она соответствует хотя бы 2 из вышеуказанных слов. Слова могут появляться в любом порядке, и если строка содержит ЛЮБОЕ два или три из этих слов, то строка должна быть выделена.

У меня есть образец текста, приведенного ниже.


Детали проектов: * Проект № 1: CVC - создание потребительской ценности (сентябрь 2007 - по настоящее время) Время Warner Cable - мировой лидер медиа и развлекательная компания, Time Warner Cable (TWC) делает коаксиальный дрожать.

Клиент: Time Warner Cable, США. ETL

Инструмент: Informatica 7.1.4

База данных: Oracle 9i.

Роль: Разработчик ETL / Руководитель группы.

O / S: UNIX.

Обязанности: Создан План тестирования и Книга тестов. Рецензируемые члены команды> Отображения. Документированные отображения. Руководство командой разработчиков. Отправка отчетов на место. Ошибка> исправление дефектов, данных и производительности.

Подробная информация о проекте № 2: MYER - продажи Аналитическая система (с ноября 2005 г. по настоящее время) Coles Myer - один из крупнейших в Австралии ритейлеров с более чем 2000 магазинов по всей Австралии,

Клиент: Коулз Майер Розничная торговля, Австралия. ETL Tool: Informatica 7.1.3 База данных: Oracle 8i. Роль: разработчик ETL. ОПЕРАЦИОННЫЕ СИСТЕМЫ : UNIX. Обязанности: добыча, Преобразование и загрузка данных используя Informatica. Понимание вся исходная система.
Созданные и запущенные сеансы и Workflows. Создано Сортировка файлов с использованием Приложение Syncsort. *

Кто-нибудь знает, как добиться этого с помощью регулярных выражений? Любые подсказки или регулярные выражения приветствуются!

Большое спасибо!

Ответы [ 4 ]

2 голосов
/ 24 октября 2009
(client|duration|environment|technologies|role).+(client|duration|environment|technologies|role)(?!\1)
1 голос
/ 23 октября 2009

Я бы разбил его на несколько простых регулярных выражений, чтобы получить эти результаты. Первый будет выбирать только кусок текста между проектами: (? = Project #). * (? <= Project #) <br> При совпадении, которое это дает, я запускаю отдельное регулярное выражение, чтобы спросить, содержит ли оно какое-либо из этих слов: client | продолжительность | окружающая среда | технологии | роль Если это совпадение возвращается с количеством более чем двух разных совпадений, вы знаете, чтобы выбрать исходную строку!

Edit:

string originalText;
MatchCollection projectDescriptions = Regex.Matches(originalText, "(?=Project #).(?:(?!Project #).)*", RegexOptions.IgnoreCase | RegexOptions.Singleline);
Foreach(Match projectDescription in projectDescriptions)
{
  MatchCollection keyWordMatches = Regex.Matches(projectDescription.value, "client | duration | environment | technologies | role ", RegexOptions.IgnoreCase);
  if(keyWordMatches.Distinct.Count > 2)
  {
    //At this point, do whatever you need to with the original projectDescription match, the Match object will give you the index etc of the match inside the original string.
  }
}
0 голосов
/ 23 октября 2009

Возможно, вам нужно разбить эти требования в два этапа: сначала возьмите пары «ключ / значение» из строки, затем примените фильтр.

string input = @"Project #...";
Regex projects = new Regex(@"(?<key>\S+).:.(?<value>.*?\.)");
foreach (Match project in projects.Matches(input))
{
    Console.WriteLine ("{0} : {1}", 
        project.Groups["key"  ].Value, 
        project.Groups["value"].Value);
}
0 голосов
/ 23 октября 2009

Попробуйте

^(details of )?project.*?((client|duration|environment|technologies|role).*?){2}.*$

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

В C #:

foundMatch = Regex.IsMatch(subjectString, @"\A(?:(details of )?project.*?((client|duration|environment|technologies|role).*?){2}.*)\Z", RegexOptions.Singleline | RegexOptions.IgnoreCase);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...