Фильтр регулярных выражений XAML-тегов с определенным атрибутом - PullRequest
0 голосов
/ 15 сентября 2011

У меня есть следующее регулярное выражение, соответствующее тегам XAML:

<[^ <>] *>

Это вернет обе эти строки:

<Button x:Name="Button1" />
<Button x:Name="Button2" Content="foo" />

Я хочу отфильтровать теги, в которых есть "Content =" foo "".

Существуют похожие примеры, но в этом случае кавычки сбивают меня с толку.

Есть идеи?

Ответы [ 2 ]

2 голосов
/ 15 сентября 2011

Regex

/<[^>]*Content="foo".*?>/g

Что означает запуск регулярного выражения (/) и поиск < с нулем или большим числом не > s ([^>]*), а затемContent="foo", за которым следует ноль или более (.*) un -свободно, затем '>' и конечное регулярное выражение /.

Код теста:

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

x = ['<Button x:Name="Button1" /><Button x:Name="Button2" Content="foo" /><Button x:Name="Button1" /><Button Content="foo" />']

console.log( x[0].match(/<[^>]*Content="foo".*?>/g) )

Обновлен в соответствии с точным противоположным (как требуется OP)

Regex

Используя отрицательное прогнозное утверждение, как подробно здесь

<((?!Content="foo")[^>])*>

Что означает совпадение <, за которым следует ноль или более, а не > s ([^>]*), которых у каждого нетContent="foo" перед ними, затем >.Добавлены скобки для необходимой группировки.

Но помните - использование регулярного выражения в качестве замены синтаксического анализа XML заставит людей из-за переполнения стека по-настоящему рассердиться на вас ... так что лучше публиковать подобные вопросы анонимно.;)

1 голос
/ 15 сентября 2011
<([^<>](?!\sContent\s*=\s*("foo"|'foo')))*>

Это ... Но ПОЖАЛУЙСТА, не используйте регулярные выражения для разбора XML.

Каждый символ, который мы фиксируем с помощью [^<>], мы проверяем, если после него идет один пробел и Content="foo",Если это правда, мы терпим неудачу, поэтому захват откатывается на один символ, и Regex проверяет завершающий >.

http://regexr.com? 2umr9

Вы должны нажатьнемного, чтобы Regex был «активирован».

Некоторые небольшие заметки: это Regex НЕПРАВИЛЬНО, потому что он пытается проанализировать XML, но игнорируя это, он не будет одурачен SContent="foo" (игнорируется)или Content='foo' (отслеживается) или :Content='foo' (игнорируется) или Content = "foo" (отслеживается).Это ясно, если вы используете парсер Regex, который обрабатывает \s как тот же список символов пробела, что и XML :-) В противном случае некоторые "странные, чужие" пробелы могут немного сломать его.Не забудьте использовать его с разбором с учетом регистра!

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