Нахождение последнего вхождения слова - PullRequest
1 голос
/ 25 ноября 2008

У меня есть следующая строка:

<SEM>electric</SEM> cu <SEM>hello</SEM> rent <SEM>is<I>love</I>, <PARTITION />mind

Я хочу найти последний стартовый тег "SEM" перед тегом "PARTITION". не конечный тег SEM, а начальный тег. Результат должен быть:

<SEM>is <Im>love</Im>, <PARTITION />

Я пробовал это регулярное выражение:

<SEM>[^<]*<PARTITION[ ]/>

, но это работает только в том случае, если между конечными тегами "SEM" и "PARTITION" нет других тегов. Есть идеи?

Ответы [ 6 ]

7 голосов
/ 25 ноября 2008

Используйте String.IndexOf для поиска PARTITION и String.LastIndexOf для поиска SEM?

int partitionIndex = text.IndexOf("<PARTITION");
int emIndex = text.LastIndexOf("<SEM>", partitionIndex);
3 голосов
/ 25 ноября 2008

А вот и ваш тупой Регекс !!!

(?=[\s\S]*?\<PARTITION)(?![\s\S]+?\<SEM\>)\<SEM\>

То, что это говорит: «Пока впереди есть тег PARTITION ... но пока впереди нет другого тега SEM ... соответствует тегу SEM».

Наслаждайтесь!

Вот это регулярное выражение:

(?=[\s\S]*?\<PARTITION) means "While ahead somewhere is a PARTITION tag"
(?![\s\S]+?\<SEM\>) means "While ahead somewhere is not a SEM tag"
\<SEM\> means "Match a SEM tag"
2 голосов
/ 26 ноября 2008

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

new Regex("...", RegexOptions.RightToLeft);
1 голос
/ 25 ноября 2008

Решение это, я тестировал в http://regexlib.com/RETester.aspx

<\s*SEM\s*>(?!.*</SEM>.*).*<\s*PARTITION\s*/> 

Если вам нужен последний, единственный способ идентифицировать это найти только символы, которые не содержат </SEM>.

Я включил "\ s *" на случай, если в <SEM> or <PARTITION/>.

есть пробелы.

По сути, мы исключаем слово </SEM> с помощью:

(?!.*</SEM>.*)
0 голосов
/ 25 ноября 2008

Немного быстро и грязно, но попробуйте это:

(<SEM>.*?</SEM>.*?)*(<SEM>.*?<PARTITION)

и посмотрите, что в C # /. Net эквивалентно $ 2

Секрет кроется в ленивой конструкции (. *?) --- я предполагаю / надеюсь, что C # поддерживает это.

Очевидно, решение Джона Скита будет работать лучше, но вы можете использовать регулярное выражение (например, для упрощения разбиения интересующих вас битов).

(Отказ от ответственности: я сам Perl / Python / Ruby ...)

0 голосов
/ 25 ноября 2008

Вы пробовали это:

<EM>.*<PARTITION\s*/>

Ваше регулярное выражение совпадало с чем угодно, кроме "<" после тега "EM". Поэтому он прекращает сопоставление, когда попадает на закрывающий тег «EM». </p>

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