Используйте Regex для разбиения массива нумерованного списка на многострочный нумерованный список

Я пытаюсь научить Regex отвечать на вопрос о португальском СО.

Ввод (массив или строка в ячейке, так .MultiLine = False)?

 1 One without dot. 2. Some Random String. 3.1 With SubItens. 3.2 With number 0n mid. 4. Number 9 incorrect. 11.12 More than one digit. 12.7 Ending (no word).

Выход

 1 One without dot.
 2. Some Random String.
 3.1 With SubItens.
 3.2 With number 0n mid.
 4. Number 9 incorrect.
 11.12 More than one digit.
 12.7 Ending (no word).

Я думал использовать Regex с Split, но я не смог реализовать пример в Excel.

Imports System.Text.RegularExpressions

Module Example
   Public Sub Main()
      Dim input As String = "plum-pear"
      Dim pattern As String = "(-)" 

      Dim substrings() As String = Regex.Split(input, pattern)    ' Split on hyphens.
      For Each match As String In substrings
         Console.WriteLine("'{0}'", match)
      Next
   End Sub
End Module
' The method writes the following to the console:
'    'plum'
'    '-'
'    'pear' 

Так что читая это и это. Сайт RegExr использовался с выражением /([0-9]{1,2})([.]{0,1})([0-9]{0,2})/igm на входе.

И получается следующее:

RegExr

Есть ли лучший способ сделать это? Правильно ли Regex или лучший способ создания? Примеры, которые я нашел в Google, не рассказывали мне о том, как правильно использовать RegEx с Split.

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

2 ответа

Решение

Я могу сделать это заканчивается словом и точкой

использование

\d+(?:\.\d+)*[\s\S]*?\w+\.

Смотрите демо-версию регулярного выражения.

подробности

  • \d+ - 1 или более цифр
  • (?:\.\d+)* - ноль или более последовательностей:
    • \. - точка
    • \d+ - 1 или более цифр
  • [\s\S]*? - любые 0+ символов, как можно меньше, вплоть до первого...
  • \w+\. - 1+ слов с последующими символами .,

Вот пример кода VBA:

Dim str As String
Dim objMatches As Object
str = " 1 One without dot. 2. Some Random String. 3.1 With SubItens. 3.2 With Another SubItem. 4. List item. 11.12 More than one digit."
Set objRegExp = New regexp ' CreateObject("VBScript.RegExp")
objRegExp.Pattern = "\d+(?:\.\d+)*[\s\S]*?\w+\."
objRegExp.Global = True
Set objMatches = objRegExp.Execute(str)
If objMatches.Count <> 0 Then
  For Each m In objMatches
      Debug.Print m.Value
  Next
End If

НОТА

Вы можете требовать, чтобы совпадения останавливались только на слове + . которые сопровождаются 0+ пробелами и числом, используя \d+(?:\.\d+)*[\s\S]*?[a-zA-Z]+\.(?=\s*(?:\d+|$)),

(?=\s*(?:\d+|$)) положительный прогноз требует наличия пробелов 0+ (\s*) с 1+ цифрами (\d+) или конец строки ($) сразу справа от текущего местоположения.

Если разделение VBA поддерживает регулярное выражение, то это может сработать, при условии, что в индексах нет цифр, кроме индексов:

    \s(?=\d)
Другие вопросы по тегам