Страницы: 1
RSS
Вытащить текст из строки в последних скобках
 
Как вытащить из строки весь текст в Последних скобках, вместе скобками. Пробую сделать регулярными функциями. написал шаблон  \(.*\)  но от вытягивает весь текст начиная с первой скобки. Как сделать правильно?

Спасибо.  
 
="("&СЖПРОБЕЛЫ(ПРАВБ(ПОДСТАВИТЬ(A2;"(";ПОВТОР(" ";200));200))
 
Спасибо большое! Оказывается можно и без регулярных функций!
Только не совсем корректно работает, если в тексте нет скобок. Открывается скобка и дальше весь текст. Можно ли учесть и этот фактор?
 
="("&TRIM(RIGHTB(SUBSTITUTE(A2;"(";REPT(" ";200));200))&IF(RIGHT(A2;1)<>")";")";"")
По вопросам из тем форума, личку не читаю.
 
Николай Венгеров,варианты UDF для вашего файл-примера

Код
 Function MyFunction$(text$)
     With CreateObject("VBScript.RegExp"): .Global = True: .IgnoreCase = True: .Pattern = "\(.+?\)"
         MyFunction = .Execute(text)(1)    
    End With
End Function

Function MyFunction2$(text$)
  MyFunction2$ = "(" & StrReverse(Split(StrReverse(text), "(", 2)(0))
End Function
Изменено: кузя1972 - 09.03.2018 20:39:56
 
Как вариант;
Код
=ПРОСМОТР(1;ПОИСК("(";ПРАВБ(A2;СТРОКА(1:1048576)));ПРАВБ(A2;СТРОКА(1:1048576)))

Плохонько, конечно, но никак додумать не могу Как в этой конструкции обойтись без "Поиск"...
 
Шаблон для поиска: \(.*?\)
Формула вставлена в C2:C4.
Функция
Изменено: Karataev - 09.03.2018 21:08:13
 
Спасибо всем большое!
Варианты Кузи 1972 работает, но только при наличии двух скобок ( )  ( ), если в строке встречается одна скобка ( ) выдает ошибку.
Выход нашел такой - сделал формулу Кузи 1972 и если ошибка вставил свою \(.*\)  
Вроде сработало.

Еще раз всем Спасибо! Умные вы!)
 
Karataev,Вообще класс!))
 
Цитата
Akropochev написал: Как в этой конструкции обойтись без "Поиск".
=ПСТР(A2;ПРОСМОТР(2;1/(ПСТР(A2;СТРОКА(1:999);1)="(");СТРОКА(1:999));99)
=ПРОСМОТР(2;1/(ПСТР(A2;СТРОКА(1:999);1)="(");ПРАВБ(A2;ДЛСТР(A2)-СТРОКА(1:999)+1))
=ПРОСМОТР(2;1/(ЛЕВБ(ПРАВБ(A2;1000-СТРОКА(1:999)))="(");ПРАВБ(A2;1000-СТРОКА(1:999)))

И не нужно задавать миллион строк. Обрабатывается весь диапазон.
 
Николай Венгеров,в регулярных выражениях главное паттерн,все остальное стандартные заклинания из справки по RegExp.В своем сообщении я написал,что привожу вариант для Вашего файл-примера,а там две скобки,согласно правилам файл-пример должен учитывать все возможные варианты сразу,а не меняться в процессе обсуждения.Более общий вариант,я уже приводил  в теме по суммированию.https://www.planetaexcel.ru/forum/index.php?PAGE_NAME=read&FID=1&TID=102145&...
Для нашего случая общий упрощенный вариант в B6
Код
 Function aaa$(t$)
    With CreateObject(Class:="VBScript.RegExp"): .Pattern = "\(.+?\)": .Global = True
    If .Execute(t).Count = 0 Then Exit Function
    If .test(t) Then aaa = .Execute(t)(.Execute(t).Count - 1)
    End With
End Function
Изменено: кузя1972 - 09.03.2018 23:42:20
 
Николай Венгеров,В сообщении #5 я предложил один вариант паттерна,фактически для конструкции .Execute(t).(Execute(t).Count-1),предлагаю упрощенный вариант для конструкции .Execute(t)(0)
без использования .Global =True
 
Код
Function vvv$(t$)
  With CreateObject(Class:="VBScript.RegExp"): .Pattern = "\([^()]+\)(?=[^()]*)$"
   If .test(t) Then vvv = .Execute(t)(0)
    End With
End Function
Изменено: кузя1972 - 11.03.2018 06:46:16
Страницы: 1
Наверх