извлечь число между двумя разными символами
irabel
Дата: Пятница, 03.05.2024, 11:52 |
Сообщение № 1
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация:
0
±
Замечаний:
0% ±
Доброго времени суток. Никак не могу сообразить подобрать регулярку, прошу помощи Нужно извлечь число, между двумя разными символами "_" и "С" "RawData_LN14838_40C.csv" - извлечь 40 "RawData_LN14838_60.5C.csv" - извлечь 60.5 "RawData_LN14838_20C.csv" - извлечь 20
Sub test()
arr = Array ("RawData_LN14838_40C.csv" , "RawData_LN14838_60.5C.csv" , "RawData_LN14838_20C.csv" )
For i = 0 To 2
Debug .Print RegExpExtract(CStr (arr(i)), "_(\S+)C" )
Next
End Sub
Public Function RegExpExtract(Text As String , Pattern As String , Optional Item As Integer = 1 ) As String
On Error GoTo ErrHandl
Set regex = CreateObject ("VBScript.RegExp" )
regex.Pattern = Pattern
regex.Global = True
If regex.test(Text) Then
Set matches = regex.Execute(Text)
RegExpExtract = matches.Item(Item - 1 )
Exit Function
End If
ErrHandl:
RegExpExtract = CVErr (xlErrValue)
End Function
Доброго времени суток. Никак не могу сообразить подобрать регулярку, прошу помощи Нужно извлечь число, между двумя разными символами "_" и "С" "RawData_LN14838_40C.csv" - извлечь 40 "RawData_LN14838_60.5C.csv" - извлечь 60.5 "RawData_LN14838_20C.csv" - извлечь 20
Sub test()
arr = Array ("RawData_LN14838_40C.csv" , "RawData_LN14838_60.5C.csv" , "RawData_LN14838_20C.csv" )
For i = 0 To 2
Debug .Print RegExpExtract(CStr (arr(i)), "_(\S+)C" )
Next
End Sub
Public Function RegExpExtract(Text As String , Pattern As String , Optional Item As Integer = 1 ) As String
On Error GoTo ErrHandl
Set regex = CreateObject ("VBScript.RegExp" )
regex.Pattern = Pattern
regex.Global = True
If regex.test(Text) Then
Set matches = regex.Execute(Text)
RegExpExtract = matches.Item(Item - 1 )
Exit Function
End If
ErrHandl:
RegExpExtract = CVErr (xlErrValue)
End Function
irabel
Ответить
Сообщение Доброго времени суток. Никак не могу сообразить подобрать регулярку, прошу помощи Нужно извлечь число, между двумя разными символами "_" и "С" "RawData_LN14838_40C.csv" - извлечь 40 "RawData_LN14838_60.5C.csv" - извлечь 60.5 "RawData_LN14838_20C.csv" - извлечь 20 [vba]
Sub test() arr = Array("RawData_LN14838_40C.csv"; "RawData_LN14838_60.5C.csv"; "RawData_LN14838_20C.csv") For i = 0 To 2 Debug.Print RegExpExtract(CStr(arr(i )); "_(\S+)C") NextEnd SubPublic Function RegExpExtract(Text As String ; Pattern As String ; Optional Item As Integer = 1) As String On Error GoTo ErrHandl Set regex = CreateObject("VBScript.RegExp") regex.Pattern = Pattern regex.Global = Тrue If regex.test(Text ) Then Set matches = regex.Execute(Text ) RegExpExtract = matches.Item(Item - 1) Exit Function End IfErrHandl : RegExpExtract = CVErr(xlErrValue )End Function
[/vba] Автор - irabel Дата добавления - 03.05.2024 в 11:52
Nic70y
Дата: Пятница, 03.05.2024, 13:40 |
Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 9041
Репутация:
2381
±
Замечаний:
0% ±
Excel 2010
Sub test()
arr = Array ("RawData_LN14838_40C.csv" , "RawData_LN14838_60.5C.csv" , "RawData_LN14838_20C.csv" )
For i = 0 To 2
Debug .Print RegExpExtract(arr(i))
Next
End Sub
Function RegExpExtract(u)
a = InStrRev (u, "C" )
b = InStrRev (u, "_" )
RegExpExtract = Mid (u, b + 1 , a - b - 1 )
End Function
Sub test()
arr = Array ("RawData_LN14838_40C.csv" , "RawData_LN14838_60.5C.csv" , "RawData_LN14838_20C.csv" )
For i = 0 To 2
Debug .Print RegExpExtract(arr(i))
Next
End Sub
Function RegExpExtract(u)
a = InStrRev (u, "C" )
b = InStrRev (u, "_" )
RegExpExtract = Mid (u, b + 1 , a - b - 1 )
End Function
Nic70y
ЮMoney 41001841029809
Ответить
Сообщение [vba]
Sub test() arr = Array("RawData_LN14838_40C.csv", "RawData_LN14838_60.5C.csv", "RawData_LN14838_20C.csv") For i = 0 To 2 Debug.Print RegExpExtract(arr(i )) NextEnd SubFunction RegExpExtract(u ) a = InStrRev(u , "C") b = InStrRev(u , "_") RegExpExtract = Mid(u , b + 1, a - b - 1)End Function
[/vba] Автор - Nic70y Дата добавления - 03.05.2024 в 13:40
i691198
Дата: Пятница, 03.05.2024, 21:25 |
Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
irabel , Добрый вечер. А зачем макросы, да ещё и с регуляркой, это можно сделать и обычными формулами.
=ПОДСТАВИТЬ(ПРАВСИМВ(A1 ;ДЛСТР(A1 )-16);"C.csv";"")
, или
=СЖПРОБЕЛЫ(ПРАВСИМВ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1 ;"_";ПОВТОР(" ";100));"C.csv";"");100))
, или =ФИЛЬТР.XML("<t><s>"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"_";"</s><s>");"C.csv";"")&"</s></t>";"//s[last()]")
irabel , Добрый вечер. А зачем макросы, да ещё и с регуляркой, это можно сделать и обычными формулами.
=ПОДСТАВИТЬ(ПРАВСИМВ(A1 ;ДЛСТР(A1 )-16);"C.csv";"")
, или
=СЖПРОБЕЛЫ(ПРАВСИМВ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1 ;"_";ПОВТОР(" ";100));"C.csv";"");100))
, или =ФИЛЬТР.XML("<t><s>"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"_";"</s><s>");"C.csv";"")&"</s></t>";"//s[last()]")i691198
Сообщение отредактировал i691198 - Пятница, 03.05.2024, 21:26
Ответить
Сообщение irabel , Добрый вечер. А зачем макросы, да ещё и с регуляркой, это можно сделать и обычными формулами.
=ПОДСТАВИТЬ(ПРАВСИМВ(A1 ;ДЛСТР(A1 )-16);"C.csv";"")
, или
=СЖПРОБЕЛЫ(ПРАВСИМВ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1 ;"_";ПОВТОР(" ";100));"C.csv";"");100))
, или =ФИЛЬТР.XML("<t><s>"&ПОДСТАВИТЬ(ПОДСТАВИТЬ(A1;"_";"</s><s>");"C.csv";"")&"</s></t>";"//s[last()]")Автор - i691198 Дата добавления - 03.05.2024 в 21:25
Kuzmich
Дата: Суббота, 04.05.2024, 14:45 |
Сообщение № 4
Группа: Проверенные
Ранг: Ветеран
Сообщений: 715
Репутация:
157
±
Замечаний:
0% ±
Excel 2003
Цитата
Нужно извлечь число, между двумя разными символами "_" и "С"
UDF
Function iChislo(cell$)
With CreateObject ("VBScript.RegExp" )
.Global = True
.MultiLine = True
.Pattern = "\d_(.+)(?:C)"
If .test(cell) Then
iChislo = .Execute(cell)(0 ).SubMatches(0 )
Else
iChislo = ""
End If
End With
End Function
Цитата
Нужно извлечь число, между двумя разными символами "_" и "С"
UDF
Function iChislo(cell$)
With CreateObject ("VBScript.RegExp" )
.Global = True
.MultiLine = True
.Pattern = "\d_(.+)(?:C)"
If .test(cell) Then
iChislo = .Execute(cell)(0 ).SubMatches(0 )
Else
iChislo = ""
End If
End With
End Function
Kuzmich
Ответить
Сообщение Цитата
Нужно извлечь число, между двумя разными символами "_" и "С"
UDF [vba]
Function iChislo(cell $) With CreateObject("VBScript.RegExp") .Global = Тrue .MultiLine = Тrue .Pattern = "\d_(.+)(?:C)" If .test(cell ) Then iChislo = .Execute(cell )(0).SubMatches(0) Else iChislo = "" End If End WithEnd Function
[/vba]Автор - Kuzmich Дата добавления - 04.05.2024 в 14:45
i691198
Дата: Воскресенье, 05.05.2024, 11:33 |
Сообщение № 5
Группа: Проверенные
Ранг: Обитатель
Сообщений: 362
Ешё можно сделать так, использовать паттерн он извлечет текст после последнего подчеркивания. А потом какой то текстовой функцией, например Replase, обрезать символы "C.csv".
Ешё можно сделать так, использовать паттерн он извлечет текст после последнего подчеркивания. А потом какой то текстовой функцией, например Replase, обрезать символы "C.csv". i691198
Ответить
Сообщение Ешё можно сделать так, использовать паттерн [vba]
.Pattern = "[^\_]+$"
[/vba] он извлечет текст после последнего подчеркивания. А потом какой то текстовой функцией, например Replase, обрезать символы "C.csv". Автор - i691198 Дата добавления - 05.05.2024 в 11:33
jun
Дата: Воскресенье, 05.05.2024, 12:21 |
Сообщение № 6
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 145
Репутация:
43
±
Замечаний:
0% ±
Можно в регулярных выражениях использовать захватывающие группы в круглых скобках, например так:
Private Function execute_numbers(what As Range, pattern As String ) As Double
With CreateObject ("Vbscript.Regexp" )
.Global = False : .MultiLine = False : .Ignorecase = False : .pattern = pattern
If .test(what) Then execute_numbers = CDbl (Replace (.Execute(what).Item(0 ).submatches.Item(0 ), "." , "," )): Exit Function
End With
execute_numbers = -1
End Function
Sub test()
Dim i As Range
For Each i In [A1:A3]
i.Offset(0 , 1 ) = execute_numbers(i, "\_([0-9.]+)[CС]" )
Next i
End Sub
паттерн:
Можно в регулярных выражениях использовать захватывающие группы в круглых скобках, например так:
Private Function execute_numbers(what As Range, pattern As String ) As Double
With CreateObject ("Vbscript.Regexp" )
.Global = False : .MultiLine = False : .Ignorecase = False : .pattern = pattern
If .test(what) Then execute_numbers = CDbl (Replace (.Execute(what).Item(0 ).submatches.Item(0 ), "." , "," )): Exit Function
End With
execute_numbers = -1
End Function
Sub test()
Dim i As Range
For Each i In [A1:A3]
i.Offset(0 , 1 ) = execute_numbers(i, "\_([0-9.]+)[CС]" )
Next i
End Sub
паттерн: jun
Ответить
Сообщение Можно в регулярных выражениях использовать захватывающие группы в круглых скобках, например так: [vba]
Private Function execute_numbers(what As Range , pattern As String ) As DoubleWith CreateObject("Vbscript.Regexp") .Global = False: .MultiLine = False: .Ignorecase = False: .pattern = pattern If .test(what ) Then execute_numbers = CDbl(Replace(.Execute(what ).Item(0).submatches.Item(0), ".", ",")): Exit FunctionEnd Withexecute_numbers = -1End FunctionSub test()Dim i As RangeFor Each i In [A1:A3 ] i.Offset(0, 1) = execute_numbers(i , "\_([0-9.]+)[CС]")Next iEnd Sub
[/vba] паттерн: [vba]
"\_([0-9.]+)[CС]"
[/vba] Автор - jun Дата добавления - 05.05.2024 в 12:21
baxtiyor1916
Дата: Среда, 08.05.2024, 10:27 |
Сообщение № 7
Группа: Пользователи
Ранг: Прохожий
Сообщений: 8
Репутация:
0
±
Замечаний:
0% ±
365
Формулами, для Excel 365:
=--ВЗЯТЬ(ТЕКСТРАЗД(A1 ;"C";"_");-1;1)
Формулами, для Excel 365:
=--ВЗЯТЬ(ТЕКСТРАЗД(A1 ;"C";"_");-1;1)
baxtiyor1916
Ответить
Сообщение Формулами, для Excel 365:
=--ВЗЯТЬ(ТЕКСТРАЗД(A1 ;"C";"_");-1;1)
Автор - baxtiyor1916 Дата добавления - 08.05.2024 в 10:27
irabel
Дата: Понедельник, 13.05.2024, 10:38 |
Сообщение № 8
Группа: Пользователи
Ранг: Прохожий
Сообщений: 3
Репутация:
0
±
Замечаний:
0% ±
Всем большое спасибо! Был в отпуске, не смог сразу ответить. Формулы не подходили, потому что это используется в большом макросе, поэтому и UDF
Всем большое спасибо! Был в отпуске, не смог сразу ответить. Формулы не подходили, потому что это используется в большом макросе, поэтому и UDF irabel
Ответить
Сообщение Всем большое спасибо! Был в отпуске, не смог сразу ответить. Формулы не подходили, потому что это используется в большом макросе, поэтому и UDF Автор - irabel Дата добавления - 13.05.2024 в 10:38