2008-11-28 4 views
0

Мне нужно Переберите все матчи в сказать следующую строку:RegEx для сопоставления текста и ограждающих брекеты

<a href='/Product/Show/{ProductRowID}'>{ProductName}</a>

Я ищу, чтобы захватить значения в {}, включая них, так что я хочу {ProductRowID} и {ProductName}

Вот мой код до сих пор:

Dim r As Regex = New Regex("{\w*}", RegexOptions.IgnoreCase) 
Dim m As Match = r.Match("<a href='/Product/Show/{ProductRowID}'>{ProductName}</a>") 

является ли мой RegEx шаблон правильно? Как выполнить циклические сопоставления значений? Я чувствую, что это должно быть очень легко, но я был в тупике сегодня утром!

+1

[Остерегайтесь Zalgo] (http://stackoverflow.com/a/1732454/135078) – 2012-01-12 22:50:37

ответ

3

Вашего шаблон отсутствует маленькая деталь:

\{\w*?\} 

Фигурные скобки должны быть экранированы, и вы хотите нежадную звезду, или ваш первый (и единственный) матч будет так: "{ProductRowID}'>{ProductName}".

Dim r As Regex = New Regex("\{\w*?\}") 
Dim input As String = "<a href='/Product/Show/{ProductRowID}'>{ProductName}</a>" 
Dim mc As MatchCollection = Regex.Matches(input, r) 
For Each m As Match In mc 
    MsgBox.Show(m.ToString()) 
Next m 

RegexOptions.IgnoreCase не требуется, потому что именно это регулярное выражение не чувствительно к регистру в любом случае.

1

Измените свой шаблон RegEx на \{\w*\}, тогда он будет соответствовать, как вы ожидаете.

Вы можете проверить его с помощью online .net RegEx tester.

+0

Ссылка на сайт отсутствует. – mmcglynn 2009-08-03 20:18:54

2

Вы можете просто группировать матчи с помощью регулярных выражений, как следующее:

<a href='/Product/Show/(.+)'\>(.+)</a> 

В этом случае у вас есть $ 1 и $ 2 соответствующие значения, которые вы хотите получить.

Вам также дать ваши матчи имена, так что они не являются анонимными/позиция ориентирована на извлечение:

<a href='/Product/Show/(?<rowid>.+)'\>(?<name>.+)</a> 
Смежные вопросы