Как разбить строку в VBA на массив с помощью функции Split, разделенной регулярным выражением - PullRequest
0 голосов
/ 18 ноября 2018

Я пишу Excel Add In, чтобы прочитать текстовый файл, извлечь значения и записать их в файл Excel. Мне нужно разделить строку, разделенную одним или несколькими пробелами , и сохранить ее в виде массива, из которого я хочу извлечь нужные значения.

Я пытаюсь реализовать что-то вроде этого:

arrStr = Split(line, "/^\s*/")

Но редактор выдает ошибку при компиляции.

Как я могу делать то, что хочу?

1 Ответ

0 голосов
/ 18 ноября 2018

Если вы ищете маршрут регулярных выражений, то вы можете сделать что-то вроде этого:

Dim line As String, arrStr, i As Long
line = "This is a  test"

With New RegExp
    .Pattern = "\S+"
    .Global = True
    If .test(line) Then
        With .Execute(line)
            ReDim arrStr(.Count - 1)
            For i = 0 To .Count - 1
                arrStr(i) = .Item(i)
            Next
        End With
    End If
End With

ВАЖНО: Вам нужно будет создать ссылку на:
Microsoft VBScript Regular Expressions 5.5 в разделе Инструменты> Ссылки
В противном случае вы можете увидеть Позднее связывание ниже

У вашей первоначальной реализации исходного шаблона \^S*\$ были некоторые проблемы:

  • S* фактически соответствовал буквальному верхнему регистру S, а не символу пробела, который вы искали - потому что он не был экранирован.
    • Даже если бы он был экранирован, вы бы сопоставили каждую строку, которую использовали, из-за вашего квантификатора: * означает совпадение ноль или больше \S.Вы, вероятно, искали квантификатор + ( один или более).
    • Вы были хороши для того, чтобы сделать его жадным (не используя *?), так как вы хотели потреблять какнасколько это возможно.

Используемый мной шаблон: (\S+) помещен в группу захвата (...), которая будет охватывать все случаи \S+ (все символы, которые НЕ являются пробелами, + один или несколько раз.

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

Как только высобрав все свои слова, вы можете затем перебрать коллекцию совпадений и поместить их в массив.


Позднее связывание:

Dim line As String, arrStr, i As Long
line = "This is a  test"

With CreateObject("VBScript.RegExp")
    .Pattern = "\S+"
    .Global = True
    If .test(line) Then
        With .Execute(line)
            ReDim arrStr(.Count - 1)
            For i = 0 To .Count - 1
                arrStr(i) = .Item(i)
            Next
        End With
    End If
End With

Разные заметки

Я бы посоветовал просто использовать Split(), но вы заявили, что были случаи, когда более чем один последовательный пробел мог быть проблемой. Если бы это было не так, вам бы вообще не понадобилось регулярное выражение,что-то вроде:

arrStr = Split(line)

Было бы разделить на каждый случайпространство

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