Регулярное выражение .NET для разделения нескольких слов или фраз - PullRequest
2 голосов
/ 19 марта 2010

Я использую код ниже, чтобы взять строку и разделить ее на массив. Он возьмет: Диснейленд и сделает его двумя отдельными элементами. Если строка содержит «Диснейленд», то это один элемент в массиве. Прекрасно работает, однако каждый раз добавляет в массив несколько пустых элементов. Поэтому я просто перебираю элементы и удаляю их, если они пусты. Есть ли в приведенном ниже коде исправление, которое предотвратит появление этих пустых элементов?

Private m_Reg As Regex
m_Reg = New Regex("([^""^\s]+)\s*|""([^""]+)""\s*")
Dim rezsplit = m_Reg.Split(criteria)

Ответы [ 2 ]

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

Алан ответ правильный. Используя его шаблон, мы могли бы использовать LINQ для фильтрации Split результатов или мы могли бы использовать Matches, как он предложил.

Dim input As String = "Islands of Adventure ""Disney Land"" Universal Studios"
Dim pattern As String = "(?<Value>[^""\s]+)|""(?<Value>[^""]+)"""
Dim result = Regex.Split(input, pattern).Where(Function(s) s.Trim <> "")

Console.WriteLine("Split Result:")
For Each s In result
    Console.WriteLine(s)
Next

Console.WriteLine("Matches:")
For Each m As Match In Regex.Matches(input, pattern)
    Console.WriteLine(m.Groups("Value").Value)
Next

''# to get string arrays use either of these instead
Dim splitArray As String() = Regex.Split(input, pattern) _
                              .Where(Function(s) s.Trim <> "") _
                              .ToArray()
Dim matchArray As String() = Regex.Matches(input, pattern).Cast(Of Match) _
                                  .Select(Function(m) m.Groups("Value").Value) _
                                  .ToArray()
2 голосов
/ 19 марта 2010

Используйте Matches вместо Split, и вам не придется об этом беспокоиться. Вы также можете упростить регулярное выражение:

m_Reg = New Regex("""([^""]+)""|[^""\s]+")

РЕДАКТИРОВАТЬ: я забыл иметь дело с проблемой удаления цитат. Это облегчит:

m_Reg = New Regex("""(?<Value>[^""]+)""|(?<Value>[^""\s]+)")

Теперь, в зависимости от того, какие альтернативные совпадения, нужный текст можно найти в группе с именем «Значение».

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