Страницы: 1
RSS
Извлечь значение между предпоследней и последней запятыми, RegIx
 
Добрый день. Не могли бы регулярным выражением извлечь значения между предпоследней и последней запятыми.в примере имеется как есть и что надо.
Изменено: artyrH - 24.11.2018 15:22:48
 
Регулярки обязательно? формула не подойдет?
=СЖПРОБЕЛЫ(ЛЕВСИМВ(ПРАВСИМВ(ПОДСТАВИТЬ(A1;",";ПОВТОР(" ";100));200);100))
Изменено: Михаил С. - 24.11.2018 15:27:42
 
Михаил С., спасибо. формулами смогу. регулярки интересуют)
 
Код
Function RegEx$(s$)
  Dim re: Set re = CreateObject("VBScript.RegExp")
  re.Pattern = ",([^,]+),[^,]*$": If re.test(s) Then RegEx = re.Execute(s)(0).submatches(0)
End Function
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо. в точности то что надо.
хотелось бы увидеть и другие варианты
 
просмотр след вариантов принесет Вам не намного больше пользы чем просмотр предыдущего
пишите сами, пока не появиться уверенность, что Вы поняли логику разработчика RegExp - тогда написание паттернов станет отнимать у Вас не намного больше времени, чем требуется чтобы набрать в определенной последовательности определенное количество символов
удачи!
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ігор Гончаренко, спасибо за напутствие. не могли бы раскомментировать паттерн. меня больше интересует как задать поиск справа налево.
 
Доброе время суток
Цитата
artyrH написал:
меня больше интересует как задать поиск справа налево.
А на основании каких рассуждений вы пришли к выводу о том, что шаблон Игоря ищет в этом направлении? Может для начала вводную почитать?
 
Цитата
Андрей VG написал:
А на основании каких рассуждений
Приветсвую. Ну основании темы и результата конечно :-)
По вопросам из тем форума, личку не читаю.
 
Цитата
БМВ написал:
основании темы и результата конечно
Привет, Михаил.
На мой взгляд, ни в названии темы ни в результате нет ничего такого, что говорило бы о поиске с права на лево :)  Это уже предположение ТС.
 
Цитата
Андрей VG написал:
шаблон Игоря ищет в этом направлении?
я и не говорил что паттерн Ігор Гончаренко,  ищет справа налево. может, именно так и ищет. без комментария не пойму.
что меня интересует уже сказал. вводную читал. нет там решений поиска последних при двух и более значений
 
Цитата
artyrH написал:
нет там решений
То есть можно сделать вывод, что изучением регулярных выражений вы не хотите заниматься, а просто ищете готовые шаблоны?
Цитата
artyrH написал:
я и не говорил что паттерн
тогда зачем была написана фраза
Цитата
artyrH написал:
меня больше интересует как задать поиск справа налево.
вместе с
Цитата
artyrH написал:
не могли бы раскомментировать паттерн
если вы не предполагали, что поиск идет с права на лево?
 
Цитата
хотелось бы увидеть и другие варианты
В столбец К
Код
Sub Tablica()
Dim i As Long
Dim iLastRow As Long
 iLastRow = Cells(Rows.Count, 1).End(xlUp).Row
 Range("K1:K" & iLastRow).ClearContents
  For i = 1 To iLastRow
    If Len(Cells(i, "A")) - Len(Replace(Cells(i, "A"), ",", "")) >= 2 Then
      Cells(i, "K") = Split(Cells(i, "A"), ",")(UBound(Split(Cells(i, "A"), ",")) - 1)
    End If
  Next
End Sub
 
Цитата
Андрей VG написал:
artyrH  написал:нет там решений
это выдернуто. там есть решения, но нет похожих задач как в этой теме.
Цитата
Андрей VG написал:
ищете готовые шаблоны?
скорее ищу логику людей, умеющих пользоваться регулярными выражениями. зачем? по моему, видя как решают спецы задачи, быстрее и легче познается самому.
Цитата
Андрей VG написал:
зачем была написана фраза
ну как зачем.. мало ли... я же просил решение.Ігор Гончаренко дал решение. и напутствие. может, после комментария даст и еще пару слов о логике поиска, так названого,справа налево
 
Kuzmich, спасибо
 
Цитата
artyrH написал:
но нет похожих задач как в этой теме
Изучение материала по ссылке нужно именно для построения рассуждений - это база для построения собственных. Если бы вы начали изучать, то смогли бы перевести набор символов шаблона Игоря ",([^,]+),[^,]*$"
Найти запятую, за которой следует группа из не менее чем одного символа алфавита, не содержащего запятую, за этой группой следует запятая, после которой идут от 0 до нескольких символов алфавита, не содержащего запятую, до конца строки. В коде VBA используются как результат символы указанной группы.
Как видите, в шаблоне нет ничего похожего на последняя запятая и предпоследняя. Нет таких терминов в регулярных выражениях. Но, чтобы уметь читать чужую логику нужно изучить базовую часть, а вот этого я и не увидел. Увидел лишь попытку построить вопрос Игорю под шаблон привычных вам алгоритмов. Только в случае регулярных выражений - это не поможет. Тут придётся учиться.
 
Цитата
Андрей VG написал:
следует запятая, после которой идут от 0 до нескольких символов алфавита, не содержащего запятую
вот это и искал. отвечает эта часть
Цитата
Андрей VG написал:
,[^,]*

Цитата
Андрей VG написал:
группа из не менее чем одного символа алфавита, не содержащего запятую
Цитата
группа Андрей VG написал:
([^,]+)
Цитата
Андрей VG написал:
[^,]  допускаются все символы, кроме запятой
вроде, проясняется) только муторно как-то. пока привыкну..
Андрей VG,  спасибо Вам. а я думаю че вы мне мозги парите... а Вы почву, оказывается, подготавливали
 
Цитата
artyrH написал:
меня больше интересует как задать поиск справа налево
у RegExp нет способа поменять направление поиска

вот это: ",[^,]*$"
вернет последнюю запятую и все, что есть за ней (если за ней что-то есть)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
ещё вариант UDF в D1 или UDF vvv
Код
Function vvv$(t$)
  vvv = StrReverse(Split(StrReverse(t), ",", 3)(1))
End Function
Код
 Function bbb$(t$)
  With CreateObject("VBScript.RegExp"): .Pattern = "[^,]+": .Global = True
       bbb = .Execute(t)(.Execute(t).Count - 2)
  End With
End Function
Изменено: кузя1972 - 24.11.2018 21:59:25
 
Цитата
Ігор Гончаренко написал:
вернет последнюю запятую и все, что есть за ней
вот я и смотрю что после работы паттерна еще и код функции обрезает справа от крайней справа запятой. каким паттерном получить этот же результат, используя код от Николая Павлова?
 
кузя1972, спасибо. только нужно то что между двумя крайними справа запятыми.
 
ещё вариант
Код
Function uuu$(t$)
 With CreateObject("VBScript.RegExp"): .Pattern = "[^,]+(?=,[^,]+$)"
  uuu = .Execute(t)(0)
 End With
End Function
Изменено: кузя1972 - 24.11.2018 22:19:26
 
кузя1972, спасибо. а можно как нибудь без Execute?
 
в теме нет файл-примера,ещё вариант в K1
Код
Function yyy$(t$)
 With CreateObject("VBScript.RegExp"): .Pattern = "([^,]+),([^,]+),([^,]+)$": .Global = True
  yyy = .Replace(t, "$2")
 End With
End Function
Изменено: кузя1972 - 24.11.2018 23:28:07
 
Цитата
кузя1972 написал:
в теме нет файл-примера
вот пример
Страницы: 1
Наверх