Страницы: 1
RSS
Найти регулярным выражением подстроки и заменить в них заданные вхождения заданными заменами
 
Здравствуйте! По найденному на Вашем сайте нижеприведенному программному коду вопросов нет.
Прошу Вас помочь внедрить  в эту функцию строковые переменные (аргументы) ReplaceWhat и ReplaceWith вместо
традиционного фиксированного значения .Replace, с тем чтобы функция возвращала исходную строку, в которой в найденных вхождениях
заменяется уже конкретно заданное "внутреннее" вхождение (если таковое найдено)  заданным значением.
Например фрагменты по маске "\s\d\d\s\d\d\d",
в них заменить "7 5" (если найдены по фильтру ReplaceWhat) на "5 7" (значение ReplaceWith)
Прошу ограничиться VBScript Regular Expressions, если это возможно вообще.
Пытаюсь использовать Replace(String, What, Whith) но опыта нет в синтаксисе.
С уважением и Спасибо
Код
'Поиск по регулярному выражению и замена. 
Public Function RegExpFindReplace(str As String, _ 
Pattern As String, _ 
Replace As String, _ 
Optional Globa1 As Boolean = True, _ 
Optional IgnoreCase As Boolean = False, _ 
Optional Multiline As Boolean = False) _ 
As String 

RegExpFindReplace = str 'Пока ничего не меняли 

If Not str Like "" And Not Pattern Like "" Then 

Dim RegExp As Object 'Для регулярного выражения 

Set RegExp = CreateObject("VBScript.RegExp") 
With RegExp 
.Global = Globa1 'Все совпадения или только первое? 
.IgnoreCase = IgnoreCase 'Регистр неважен? 
.Multiline = Multiline 'Игнорировать переносы строк? 
.Pattern = Pattern 'Регулярка 
End With 

'Найти/заменить 
On Error Resume Next 
RegExpFindReplace = RegExp.Replace(str, Replace) 

Set RegExp = Nothing 'Очистка памяти 
End If 
End Function
 
RegExpFindReplace = Replace(RegExp.Replace(str, Replace) , What, Whith)
?
 
не нашел файл-примера,(что дано что надо),-вариант функции в E1для #1
 
Код
Function uuu$(t$)
 With CreateObject("VBScript.RegExp"): .Pattern = "\s?(\d)+\s(\d+)": .Global = True
    uuu = .Replace(t, "$2 $1")
 End With
End Function
Изменено: sv2013 - 07.04.2017 17:09:32
 
Уважаемый sv2013. Спасибо за отклик. Я плохо объяснил.
Мне казалось пример здесь не нужен, потому что планируется универсальная функция.
Особенности: четыре аргумента
1 - сама  строка любых символов, с которой работаем
2 - значение маски Pattern
3 - значение фрагмента вхождения в найденных подстроках
4 - значение их замен
То есть имеем 2 уровня, первый - определение вхождений паттерна, а второй -
замена в найденных вхождениях, но не фиксированным значением, а заданной парой What и With.
Для примера строка

912 914 20 35, Марина marina@therm.com, (495) 300-76 Картина Репина Новости

то есть любая строка (даже с мнимыми символами)
для нее задаю аргументом строковое значение Pattern (любой, какой мне нужен, например "\d\d\d\s\d\d\d")
для второго уровня задаю аргументом значение, что менять (например пробел " ")
и значение, чем менять (например "-")
В таком случае будет результат

912-914 20 35, Марина marina@therm.com, (495) 300-76 Картина Репина Новости

Уважаемый Jungl. Я так понял, что Вы предлагаете вариант
Сначала заменить вхождения чем-то фиксированным, а потом уже проводить замену What With.
Это не то. В любом случае спасибо за отклик.

Я пытался решить, пока не решил, думаю копать перебором вхождений Matches.
 
Цитата
RAVILOGO написал:
Сначала заменить вхождения чем-то фиксированным, а потом уже проводить замену What With.
Неа, меняем в найденном значении нужный нам символ на другой символ. В общем, как понял так и ответил.
Но в данном случае в строке 912 914 20 35, Марина marina@therm.com, (495) 300-76 Картина Репина Новости все пробелы заменяться на тире.
Пишите конкретику, приложите файл пример, укажите там из чего и что хотите получить.
В вашем случае будет примерно так:
Код
Sub test()
s = "912 914 20 35, Марина marina@therm.com, (495) 300-76 Картина Репина Новости"
r = RegExpFindReplace(s, "\s{1,}", "-")
End Sub
 
Уважаемый Jungl.
Речь изначально идет о функции.
Что касается моей маски в примере (три цыфры, пробел и три цыфры), то если двигать ее по строке, найдем только одно вхождение,
и уже в этом вхождении найдем только 1 пробел.
Видимо я ошибаюсь в символике шаблонов, но это не принципиально, здесь все "нарастет".
Нужна функция с аргументами, которую, как UDF, я мог бы использовать
в любом проекте EXCEL. При этом для каждого случая подставлять нужные мне
значения (исходная строка, шаблон поиска, подстрока поиска, подстрока замены).
Ну и речь также идет не об одном символе, а о подстроке.
Для  разового вычисления Вы (вероятно) правы. Но зачем мне каждый раз менять аргументы в процедуре, не удобнее ли это
делать при вводе формулы в ячейку?
К тому же каждый раз сохранять файл перед процессом, ведь макрос не обеспечивает отката. С функцией проще.
Постановка "из чего что?" здесь бесполезна.
Сегодня я захочу менять пробелы на тире, а завтра наоборот, или Марина на Таня, причем по всему столбцу таблицы.
И Ctrl-H здесь тоже не поможет.

Спасибо за участие.
 
Цитата
RAVILOGO написал:
макрос не обеспечивает отката. С функцией проще.
А подумать?
 
Доброго времени суток.
Вот наваял своим мизерным VBA опытом.
Наверное, это все может быть значительно короче.
Мне лично осталось усвоить, как таблицу умножения, метасимволы.

Function regex(strInput As String, strPattern As String, strWhat As String, strWith As String) As String
   Dim inputRegexObj As New VBScript_RegExp_55.RegExp
   Dim inputMatches As Object
   Dim replaceNumber As Integer
   Dim i As Integer
   Dim substr As String
   
   With inputRegexObj
       .Global = True
       .MultiLine = True
       .IgnoreCase = False
       .Pattern = strPattern
   End With
   
   Set inputMatches = inputRegexObj.Execute(strInput)
   
   If inputMatches.Count = 0 Then
   
       regex = strInput
       
       Else
       
       replaceNumber = inputMatches.Count
       
             
          For i = 0 To replaceNumber - 1
             
             With inputRegexObj
               .Global = False
               .MultiLine = True
               .IgnoreCase = False
               .Pattern = strPattern
             End With
             
             Set inputMatches = inputRegexObj.Execute(strInput)
             substr = inputMatches(0).Value
             regex = Left(strInput, inputMatches(0).FirstIndex) & Replace(substr, strWhat, strWith) _
             & Right(strInput, (Len(strInput) - inputMatches(0).FirstIndex - inputMatches(0).Length))
             strInput = regex
          Next
   End If
       
       
End Function


Но, работает и заявленную задачу выполняет.
Буду признателен, если кто пожелает упростить (поправить), или дать конструктивное замечание.

Прилагаю простенький файл.
Повторюсь, что шаблоны (собственно и задачи) могут быть любыми с использованием
метасимволов RegExp.
Спасибо
Изменено: RAVILOGO - 10.04.2017 12:43:52 (Некорректный формат)
 
Вернитесь в сообщение и отредактируйте его.
Кнопка форматирования кода - <...>
Страницы: 1
Читают тему
Наверх