Регулярное выражение для строки, заключенной в <*>, C # - PullRequest
0 голосов
/ 14 декабря 2009

Я пытаюсь заключить все строки в <*>, используя следующее регулярное выражение:

Regex regex = new Regex(@"\<(?<name>\S+)\>", RegexOptions.IgnoreCase);
string name = e.Match.Groups["name"].Value;

Но в некоторых случаях, когда у меня есть текст вроде:

<Vendors><Vtitle/>  <VSurname/></Vendors> 

Он возвращает две строки вместо четырех, т. Е. Над выходами Regex

<Vendors><Vtitle/> //as one string and 
<VSurname/></Vendors> //as second string

Где, как я ожидаю, четыре строки:

<Vendors>
<Vtitle/>
<VSurname/>
</Vendors> 

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

Я попытался добавить '\ b', чтобы указать границу слова

new Regex(@"\b\<(?<name>\S+)\>\b", RegexOptions.IgnoreCase);

, но это не помогло.

Ответы [ 3 ]

9 голосов
/ 14 декабря 2009

Вы получите большую часть того, что хотите, используя регулярное выражение /<([^>]*)>/. (Нет необходимости избегать угловых скобок », так как угловые скобки не являются специальными символами в большинстве механизмов регулярных выражений, включая механизм .NET.) Предоставленное мной регулярное выражение также будет захватывать конечные пробелы и любые атрибуты тега - надежно анализировать эти вещи это путь, выходящий за рамки разумного регулярного выражения.

Однако имейте в виду, что если вы пытаетесь проанализировать XML / HTML с помощью регулярного выражения, этот путь кроется в безумии

6 голосов
/ 14 декабря 2009

Регулярные выражения - неправильный инструмент для анализа XML. Попробуйте использовать System.Xml.Linq (XElement) API.

4 голосов
/ 16 декабря 2009

Ваше регулярное выражение использует \ S + в качестве подстановочного знака. По-английски это «серия из одного или нескольких символов, ни один из которых не является пробелом». Другими словами, когда к этой строке применяется регулярное выражение <(?<name>\S+)>: '`, регулярное выражение будет соответствовать всей строке. угловые скобки не являются пробелами.

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

Регулярное выражение для этого <(?<name>[^>]+)>.

Ааа, регулярные выражения. Язык разработан, чтобы выглядеть как ругань мультфильма.

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