VB. net Разделить строку с регулярным выражением - PullRequest
1 голос
/ 08 марта 2020

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

Входная строка (намеренно написана безобразно):

Berlin "New York"Madrid 'Frankfurt Am Main' Quebec Łódź   München Seattle,Milano

Код разделения:

Dim subStrings() As String = Regex.Split(myText, """([^""]*)""|,| ")

Результат:

0)  
1)  
2)Berlin  
3)  
4)New York  
5)Madrid  
6)'Frankfurt  
7)Am  
8)Main'  
9)Quebec  
10)Łódź  
11)  
12)  
13)München  
14)Seattle  
15)Milano  

Короче говоря, строка должна быть разбита на массив "" (пробел) и / или "," char и / или одинарной или двойной кавычкой. Цитируемые термины следует рассматривать как одно слово. Это означает, что термин в одинарных кавычках (в месте 6) будет рассматриваться так же, как термин в двойных кавычках. Таким образом, «Франкфурт на Майне» на 6-м месте будет «одним словом», таким же, как «Нью-Йорк» на 4-м месте. Также мне хотелось бы, чтобы можно было сделать регулярное выражение, чтобы пустые совпадения не go с subStrings () массив. В конце концов идеальный результат из приведенного примера должен быть таким:

0)Berlin  
1)New York  
2)Madrid  
3)Frankfurt Am Main  
4)Quebec  
5)Łódź  
6)München  
7)Seattle  
8)Milano  

Итак, пожалуйста, если кто-то знает, как решить это конкретное регулярное выражение для меня.

1 Ответ

1 голос
/ 08 марта 2020

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

"([^"]*)"|'([^']*)'|([^,\s]+)

См. Демонстрационную версию regex .

Подробности

  • "([^"]*)" - ", затем группа 1 соответствует любым 0+ символам, кроме ", а затем "
  • | - или
  • '([^']*)' - ', затем группа 2, соответствующая любым 0+ символам, кроме ', а затем '
  • | - или
  • ([^,\s]+) - Группа 3: любые 1+ символов, кроме , и пробелов

VB. NET фрагмент кода:

Dim text = "Berlin ""New York""Madrid 'Frankfurt Am Main' Quebec Łódź   München Seattle,Milano"
Dim pattern As String = """([^""]*)""|'([^']*)'|([^,\s]+)"
Dim matches() As String = Regex.Matches(text, pattern) _
          .Cast(Of Match)() _
          .Select(Function(m) m.Groups(1).Value & m.Groups(2).Value & m.Groups(3).Value) _
          .ToArray()

Результаты:

enter image description here

То же самое можно получить при использовании следующего подхода Regex.Split:

pattern = """([^""]*)""|'([^']*)'|[,\s]+"
Dim matches() As String = Regex.Split(text, pattern).Where(Function(m) Not String.IsNullOrWhiteSpace(m)).ToArray()

См. Демонстрационную версию regex .

...