Регулярное выражение, которое выбирает первые числа для отображения в цикле

#regex #vba

#регулярное выражение #vba

Вопрос:

итак, в основном у меня есть следующие типы строк

Уникальный

Десятичная строка

Сотня

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

 Sub Validator()
Dim r As Range
Dim s As String
Dim news As String
Dim regex As New RegExp
Dim regex2 As New RegExp
regex.Global = True
regex.Pattern = ",[sS]*$"
regex2.Pattern = "(^|\s)([0-9] )($|\s)"


Sheet1.Activate


For Each r In Range("B1:B17")
    s = r.Value
    
    news = regex2.Replace(s, " ")
    
    r.Value = news

Next r

End Sub
 

Пожалуйста, игнорируйте шаблон 1, он в основном удаляет все знаки после запятой, и это успешно, проблема в шаблоне 2, который практически ничего не делает, когда я выполняю свой код, и я знаю, что код работоспособен, потому что первый вышел правильно.

A3 Sport 1.8 16V TFSI S-tronic 3p

A3 Седан Prestige Plus 1.4 TFSI Гибкий Наконечник

TT 1,8 ТБ 180cv

Должны быть конечные результаты

Комментарии:

1. У вас есть более (разнообразные) образцы данных с желаемыми результатами?

2.Возможно, попробуйте это с группой захвата ^([^drn]*)bd (?:[.,]d )? regex101.com/r/kPn74f/1

3. Вы хотите удалить первое число? Затем используйте regex.Global = False и regex2.Pattern = "d (?:.d )?"

4. @INGl0R1AM0R1, верно. Кстати, по какой-либо причине вы используете регулярные выражения? Примеры, которые вы привели, прекрасно выполнены с помощью обычных функций VBA.

5. Например: Debug.Print Mid(Split(str, ",")(0), InStr(1, str, " ") 1, Len(str)) где str содержит ваши строковые переменные.

Ответ №1:

Вы можете удалить первое число, используя

 Sub Validator()
Dim r As Range
Dim s As String
Dim news As String
Dim regex As New RegExp
Dim regex2 As New RegExp
regex.Global = False             ' <---- Enabling first match search only (you may also just remove this line)
regex2.Pattern = "d (?:.d )?" ' <---- One or more digits, and an optional occurrence of
                                 '       a dot and one or more digits right after
Sheet1.Activate
For Each r In Range("B1:B17")
    s = r.Value
    r.Value = regex2.Replace(s, " ")
Next r

End Sub
 

Обратите regex.Global внимание, что значение по умолчанию равно False , поэтому вы можете просто удалить строку с regex.Global = False помощью .

Если ваши числа могут иметь смешанный десятичный разделитель, например . , и , , используйте regex2.Pattern = "d (?:[.,]d )?" .

Ответ №2:

Глядя на ваши примеры, я думаю, что я бы выбрал обычную функциональность VBA, поскольку эти примеры не выглядят слишком сложными.

Например:

 Sub Test()

Dim str As String: str = "44 A3 Sedan Prestige 1.4 TFSI Flex Tip., 8561"
Debug.Print Mid(Split(str, ",")(0), InStr(1, str, " ")   1, Len(str))

End sub
 

Если вы настаиваете на регулярных выражениях, похоже, вы можете просто использовать:

 Sub Test()

Dim str As String: str = "44 A3 Sedan Prestige 1.4 TFSI Flex Tip., 8561"

With CreateObject("vbscript.regexp")
    .Global = True
    .Pattern = "^S s([^,] )"
    Debug.Print .Execute(str)(0).Submatches(0)
End With

End Sub
 

Оба параметра возвращают:

 A3 Sedan Prestige 1.4 TFSI Flex Tip.