#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/13. Вы хотите удалить первое число? Затем используйте
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.