Страницы: 1
RSS
Регулярные выражения (RegExp). Преобразовать коллекцию совпадений в массив
 
Доброго времени суток, Планетяне!

Насколько я понял из интернетов, это невозможно, но, на всякий случай, уточню у местных мастеров пару вопросов:
1. Можно ли полученную коллекцию совпадений .Execute(strVal) преобразовать в массив без цикла?
1. 1. Если нет, то можно ли сцепить эти элементы через разделитель без цикла (типа Join)?

P.S.: закомментированное работает (сбор массива в цикле)
Код
Option Explicit
'===========================================================================================
Public Function PRDX_RegExp_Execute(strVal$, ptrn$)
Dim m As Object, arr, n&, txt$
n = -1: ReDim arr(0 To 1000): PRDX_RegExp_Extract = ""
    With CreateObject("VBScript.RegExp")
        .Global = 1: .IgnoreCase = 0: .MultiLine = 1: .Pattern = ptrn
        If Not .Test(strVal) Then Exit Function
'        For Each m In .Execute(strVal)
'            n = n + 1: arr(n) = m.Value
'        Next
        Set m = .Execute(strVal)
    End With
PRDX_RegExp_Extract = Join(m)
'ReDim Preserve arr(0 To n): PRDX_RegExp_Extract = Join(arr)
End Function
Изменено: Jack Famous - 04.12.2018 18:23:32
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Добрый день. Как пример
Код
Sub m23SuperScript() 'приводим м2 м3, а также км2, дм3, см, мм и т.д. к красивому виду с приподнятым шрифтом
    Dim objRE As Object, objMatch As Object, sS As String, rC As Range, bytB As Byte
        Set objRE = CreateObject("VBScript.RegExp") 'формируем объект регулярного выражения
        With objRE 'задаем параметры - искать все совпадения, игнорировать регистр и задаем шаблон поиска
            .Global = True
            .ignorecase = True
            .Pattern = "[mм][23]" 'паттерн показывает искать сочетание букв из набора "mм" (Без учета регистра) с цифрами из набора "23"
        End With
        For Each rC In Selection 'пребираем ячейки в выделенном диапазоне
            If objRE.Test(rC) Then 'если в ячейке есть подходящее сочетание (test выдаст True)
                Set objMatch = objRE.Execute(rC) 'получаем всю коллекцию совпадений
                With objMatch
                    For bytB = 0 To .Count - 1 ' для каждого элемента коллекции совпадений (Item считается с 0)
                        'в ячейке отступаем от позиции начала совпадения 2 символа и изменяем шрифт для 1 символа на приподнятый
                        rC.Characters(.Item(bytB).firstindex + 2, 1).Font.Superscript = True
                    Next bytB
                End With
            End If
        Next rC
        Set objRE = Nothing: Set objMatch = Nothing: Set rC = Nothing 'обнуляем объектные пременные
End Sub
Кому решение нужно - тот пример и рисует.
 
Пытливый, убрал "лишние" вопросы из стартового сообщения, т.к. имел ввиду работу с результатом пользовательской функции, возвращающей .Execute(str) и сам потестирую  :) спасибо)
Изменено: Jack Famous - 04.12.2018 12:48:05
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх