Здравствуйте! Периодически необходимо приводить в порядок телефонные справочники, в которых номера телефонов записаны как-попало. Например, 89555555555 нужно заменить на 8-955-555-55-55. Да, есть Wildcard, но на сложные шаблоны он ругается. Например, 8(9[0-9][0-9])([0-9][0-9][0-9])([0-9][0-9])([0-9][0-9]) для Wildcard непосильная задача. Можно использовать 8(9[0-9][0-9])([0-9][0-9][0-9])([0-9][0-9]) и 8-\1-\2-\3-, в самых простых случаях работает, однако присылают порой такой зоопарк из телефонных номеров, что без использования регулярных выражений обойтись трудно. Попытался сделать поиск и замену с использованием регулярных выражений, в обычном тексте с горем пополам работает, а вот таблицы после работы кода убиваются (а справочники обычно все в таблицах). Подскажите пожалуйста, в каком направлении дальше копать? [vba]
Код
Public Function regex$(strokain$, shablon$, sReplace$) Dim Sout As String, RegExp As Object Sout = strokain Set RegExp = CreateObject("VBScript.RegExp") RegExp.Global = True RegExp.Pattern = shablon Do If RegExp.Test(Sout) Then Sout = RegExp.Replace(Sout, sReplace) End If Loop While RegExp.Test(Sout) regex = Trim(Sout) End Function
Sub findreplwregex() Dim R As Object, tx As String Set R = ActiveDocument.Range R.Select tx = Selection.Range Dim strokain$, shablon$, sReplace$ strokain = tx shablon = "(8)(9\d\d)(\d\d\d)(\d\d)(\d\d)" sReplace = "$1-$2-$3-$4-$5" Selection.Range.Text = regex(strokain, shablon, sReplace) End Sub
[/vba] p.s. Что-то заглючило, никак не получается сохранить модуль с кодом в файле (
Здравствуйте! Периодически необходимо приводить в порядок телефонные справочники, в которых номера телефонов записаны как-попало. Например, 89555555555 нужно заменить на 8-955-555-55-55. Да, есть Wildcard, но на сложные шаблоны он ругается. Например, 8(9[0-9][0-9])([0-9][0-9][0-9])([0-9][0-9])([0-9][0-9]) для Wildcard непосильная задача. Можно использовать 8(9[0-9][0-9])([0-9][0-9][0-9])([0-9][0-9]) и 8-\1-\2-\3-, в самых простых случаях работает, однако присылают порой такой зоопарк из телефонных номеров, что без использования регулярных выражений обойтись трудно. Попытался сделать поиск и замену с использованием регулярных выражений, в обычном тексте с горем пополам работает, а вот таблицы после работы кода убиваются (а справочники обычно все в таблицах). Подскажите пожалуйста, в каком направлении дальше копать? [vba]
Код
Public Function regex$(strokain$, shablon$, sReplace$) Dim Sout As String, RegExp As Object Sout = strokain Set RegExp = CreateObject("VBScript.RegExp") RegExp.Global = True RegExp.Pattern = shablon Do If RegExp.Test(Sout) Then Sout = RegExp.Replace(Sout, sReplace) End If Loop While RegExp.Test(Sout) regex = Trim(Sout) End Function
Sub findreplwregex() Dim R As Object, tx As String Set R = ActiveDocument.Range R.Select tx = Selection.Range Dim strokain$, shablon$, sReplace$ strokain = tx shablon = "(8)(9\d\d)(\d\d\d)(\d\d)(\d\d)" sReplace = "$1-$2-$3-$4-$5" Selection.Range.Text = regex(strokain, shablon, sReplace) End Sub
[/vba] p.s. Что-то заглючило, никак не получается сохранить модуль с кодом в файле (aequit
Хорошая статья, много примеров для правки телефонных номеров. В Excelе как-то легче регэкспы можно использовать - прикрутил циклом перебор текста в диапазоне ячеек и там всё, что нужно ищется и меняется. А вот похожие функции к Word прикрутить не выходит. Кроме телефонных номеров может возникнуть необходимость использования сложных масок, с которыми Wildcard не справляется...
Хорошая статья, много примеров для правки телефонных номеров. В Excelе как-то легче регэкспы можно использовать - прикрутил циклом перебор текста в диапазоне ячеек и там всё, что нужно ищется и меняется. А вот похожие функции к Word прикрутить не выходит. Кроме телефонных номеров может возникнуть необходимость использования сложных масок, с которыми Wildcard не справляется...aequit
Да проблема не в том, как написать шаблон с использованием регулярных выражений, с этим всё понятно. Пусть в тексте нужно найти и обработать не телефонные номера, а что-либо посложнее, с чем не справляется Wildcard. Есть функция, в неё передаётся 3 аргумента - текст для поиска, шаблон поиска и шаблон для замены. При использовании Find вместе с Wildcard проблем нет... Но если требуется использовать регулярные выражения, то в качестве аргумента в функцию приходится передавать весь текст в документе, как я могу выделить нужную часть текста для обработки, когда Find не поймет шаблон с синтаксисом регулярных выражений? С обычным текстом код из первого сообщения работает, но если есть в документе таблица, то она удаляется. Здесь нужен какой-то иной подход, но даже направление, в каком двигаться дальше, не могу найти (
Да проблема не в том, как написать шаблон с использованием регулярных выражений, с этим всё понятно. Пусть в тексте нужно найти и обработать не телефонные номера, а что-либо посложнее, с чем не справляется Wildcard. Есть функция, в неё передаётся 3 аргумента - текст для поиска, шаблон поиска и шаблон для замены. При использовании Find вместе с Wildcard проблем нет... Но если требуется использовать регулярные выражения, то в качестве аргумента в функцию приходится передавать весь текст в документе, как я могу выделить нужную часть текста для обработки, когда Find не поймет шаблон с синтаксисом регулярных выражений? С обычным текстом код из первого сообщения работает, но если есть в документе таблица, то она удаляется. Здесь нужен какой-то иной подход, но даже направление, в каком двигаться дальше, не могу найти (aequit
Доброе время суток Используя RegExp - регулярные выражения получаете коллекцию Matches вхождений текста удовлетворяющих шаблону. Передаёте Find очередное найденное вхождение и текст для замены для всех найденных. Так как-то.
Доброе время суток Используя RegExp - регулярные выражения получаете коллекцию Matches вхождений текста удовлетворяющих шаблону. Передаёте Find очередное найденное вхождение и текст для замены для всех найденных. Так как-то.anvg
anvg, К сожалению, Find не умеет работать с шаблонами регулярных выражений, ему только Wildcard подавай, иногда этого мало ( Спасибо, кто откликнулся. Сначала не мог догадаться, как обрабатывать содержимое каждой ячейки. Долго стучал по клавишам и методом научного тыка решил проблему поиска и замены с использованием регулярных выражений внутри таблицы с помощью этого кода: [vba]
Код
Dim A As Byte, B As Integer, LC As Byte, LR As Integer Dim strokain$, shablon$, sReplace$ LC = ActiveDocument.Tables(1).Columns.Last.Index 'Получаем номер последнего столбца LR = ActiveDocument.Tables(1).Rows.Last.Index 'Получаем номер последней строки For A = 1 To LC 'Циклом перебираем все столбцы For B = 1 To LR 'Для каждого столбца циклом перебираем все строки strokain = ActiveDocument.Tables(1).Cell(B, A).Range.Text strokain = Left$(strokain, VBA.Len(strokain) - 2) 'Удаляем лишние 2 символа shablon = "(8)(9\d\d)(\d\d\d)(\d\d)(\d\d)" sReplace = "$1-$2-$3-$4-$5" ActiveDocument.Tables(1).Cell(B, A).Range.Text = _ regex(strokain, shablon, sReplace) 'передаём аргумента в функцию regex Next B Next A
[/vba]
Так таблица остаётся целой, что и желалось.
anvg, К сожалению, Find не умеет работать с шаблонами регулярных выражений, ему только Wildcard подавай, иногда этого мало ( Спасибо, кто откликнулся. Сначала не мог догадаться, как обрабатывать содержимое каждой ячейки. Долго стучал по клавишам и методом научного тыка решил проблему поиска и замены с использованием регулярных выражений внутри таблицы с помощью этого кода: [vba]
Код
Dim A As Byte, B As Integer, LC As Byte, LR As Integer Dim strokain$, shablon$, sReplace$ LC = ActiveDocument.Tables(1).Columns.Last.Index 'Получаем номер последнего столбца LR = ActiveDocument.Tables(1).Rows.Last.Index 'Получаем номер последней строки For A = 1 To LC 'Циклом перебираем все столбцы For B = 1 To LR 'Для каждого столбца циклом перебираем все строки strokain = ActiveDocument.Tables(1).Cell(B, A).Range.Text strokain = Left$(strokain, VBA.Len(strokain) - 2) 'Удаляем лишние 2 символа shablon = "(8)(9\d\d)(\d\d\d)(\d\d)(\d\d)" sReplace = "$1-$2-$3-$4-$5" ActiveDocument.Tables(1).Cell(B, A).Range.Text = _ regex(strokain, shablon, sReplace) 'передаём аргумента в функцию regex Next B Next A
[/vba]
Так таблица остаётся целой, что и желалось. aequit