LookAhead Regex в .Net - неожиданный результат - PullRequest
1 голос
/ 17 марта 2010

Я немного озадачен результатами Regex (и все еще пытаюсь разобраться с синтаксисом). Я использовал http://regexpal.com/, чтобы проверить свое выражение, и оно работает там, где это было задумано, однако в C # это не так, как ожидалось.

Вот тест - выражение следующее: (?=<open>).*?(?=</open>)

на входной строке: <open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>

Я ожидаю, что результат будет <open>Text1 <open>Text 2 <open>Text 3... и т. Д.

Однако, когда я делаю это в C #, возвращается только первое совпадение <open>Text1

Как я могу получить все пять «результатов» от Regex?

    Regex exx = new Regex("(?=<open>).*?(?=</open>)", RegexOptions.IgnoreCase | RegexOptions.Singleline);
    string input = "<open>Text 1</open> Text 2 <open> Text 3 </open> Text 4 <open> Text 5 </open>";
    string result = Regex.Match(input, exx.ToString(), exx.Options).ToString(); 

Ответы [ 2 ]

1 голос
/ 17 марта 2010

Используйте Regex.Matches вместо Regex.Match.

PS Home:> $s = '<open>Text 1 </open>Text 2 <open>Text 3 </open>Text 4 <open>Text 5 </open>'
PS Home:> $re = '(?=<open>).*?(?=</open>)'
PS Home:> @([regex]::Match($s, $re)).Length
1
PS Home:> @([regex]::Matches($s, $re)).Length
3

В документации по Regex.Match указано:

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

, тогда как для Regex.Matches:

Поиск во входной строке всех вхождений регулярного выражения и возврат всех успешных совпадений.

Примечание: То, что вы здесь делаете, кажется очень неправильным. Если вы имеете дело с XML или подобным языком, то, пожалуйста, не используйте регулярные выражения для его анализа. Вы будете злиться иначе с вложенными структурами.

0 голосов
/ 17 марта 2010

Вы действительно хотите иметь <open> в начале каждого матча?Почему бы не использовать lookbehind тоже?

(?<=<open>).*?(?=</open>)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...