Регулярное выражение .net для соответствия двух слов, разделенных запятой, не работает - PullRequest
2 голосов
/ 05 марта 2010

Может кто-нибудь объяснить это мне. Я довольно хорошо разбираюсь в регулярных выражениях Perl, но, очевидно, я не понимаю, почему это не работает.

Приведенный ниже код сохраняет «Персональный тест» в выходной переменной.

im output As String
Dim userName As String = "Test, Person"
Dim re As New Regex("(\w+),\s(\w+)", RegexOptions.Singleline)
output = re.Replace(userName, "$2 $1")

Так почему следующий код не сохраняет "# Test ## Person #" в выходной переменной.

Dim output As String
Dim userName As String = "Test, Person"
Dim re As New Regex("(\w+),\s(\w+)")
For Each Match As Match In re.Matches(userName)
    output &= "#" & Match.ToString & "#"
Next

Спасибо за помощь.

Ответы [ 2 ]

2 голосов
/ 05 марта 2010

Вы путаете спички и группы. Совпадение - это полное совпадение, включая все символы как в группах, так и не в группах. Группа - это только часть совпадения в скобках. В группе .NET 0 - полное совпадение, а остальные группы 1,2, ... и т. Д. Аналогичны принципам работы $ 1, $ 2 и т. Д. Возможно, вы поймете это лучше, если попытаетесь запустить это:

    For Each Group As Group In re.Match(userName).Groups
        output &= "#" & Group.ToString & "#"
    Next
0 голосов
/ 05 марта 2010

Я думаю, что это будет работать

output = re.Replace(userName, "\2 \1")

Для второго:

For Each Match As Match In re.Matches(userName)
    output &= "#" & Match.Groups(1) & "#" & "#" & Match.Groups(2) & "#"
Next
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...