Использование регулярного выражения C # для выбора текста на основе пользовательских тегов - PullRequest
0 голосов
/ 09 апреля 2010

У меня есть строка в c #, содержащая некоторые данные, которые мне нужно извлечь, основываясь на определенных условиях.

Строка содержит много тендеров в следующем виде:

<TENDER> some words, don't know how many, may contain numbers and things like slashes (/) or whatever <DESCRIPTION> some more words and possibly other things like numbers or whatever describing the tender here </DESCRIPTION> some more words and possibly numbers and weird things </TENDER>

Эта строка не содержит вложенных тегов <TENDER>, она плоская. Теги <DESCRIPTION> встречаются только один раз внутри тегов <TENDER>.

Я использую: <TENDER>(.+?)</TENDER> в качестве регулярного выражения для разделения тендеров, и это прекрасно работает. Если это неправильно или глупо, и вы знаете лучший способ написать это, пожалуйста, дайте мне знать, так как я обнаружил, что я отстой в регулярном выражении.

Моя проблема в том, что теперь мне нужно выбрать тендер только в том случае, если его описание содержит какое-либо слово в списке ключевых слов (скажем, сейчас я хочу выбрать тендер, только если он содержит либо «бетон», либо «кирпич» в описание).

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

<TENDER>(.+?)<DESCRIPTION>have no idea what to do here</DESCRIPTION>(.+?)</TENDER>

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

Ответы [ 3 ]

2 голосов
/ 09 апреля 2010

Используйте

<TENDER>([^<>]+?)<DESCRIPTION>[^<>]*?(brick|concrete)[^<>]*?</DESCRIPTION>([^<>]+?)</TENDER> 

Я использую [^<>] вместо ., чтобы не оставлять теги.

1 голос
/ 09 апреля 2010

Используйте IgnorePatternWhiteSpace, потому что я прокомментировал шаблон. Не влияет на обработку данных ... позволяет разбивать шаблоны и комментировать.

string pattern = @"
(?<=<TENDER>)            # Look Behind for TENDER
(?<TenderBefore>.*?)     # Put the data into the TenderBefore Named Match Capture Group
(?:<DESCRIPTION>)
(?=.*brick|concrete)     # Look ahead for the keywords
(?<Description>.*?)      # Put the data into the Description NMCG
(?:</DESCRIPTION>)
(?<TenderAfter>.*?)      # Put text into NMCG TenderAfter
(?=<\/TENDER>)           # Tender Look ahead.";

После обработки совпадений извлеките данные из каждого совпадения, например

string Tender = string.Format("{0}<DESCRIPTION>{1}</DESCRIPTION>{2}",
 myMatch.Groups["TenderBefore"].Value,
 myMatch.Groups["Description"].Value,
 myMatch.Groups["TenderAfter"].Value);

НТН

0 голосов
/ 09 апреля 2010

Вместо регулярных выражений попробуйте использовать подходящую библиотеку DOM-анализа, такую ​​как Html Agility Pack . Он должен работать с любыми тегами, даже пользовательскими.

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