Страницы: 1
RSS
Несколько регулярных выражений для одной строки.
 
Доброго времени суток. Подскажите кто сталкивался. Есть такой код.

Код
Sub XML_Replace()

    Dim s, Stroka2 As String
    Dim myRegExp As New RegExp  
    
With myRegExp
    .Global = True 
    .IgnoreCase = False 
    .MultiLine = False 
    .Pattern = ">\d{10}<|>\d{12}|>\d{13}<|>\d{15}<|>((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}<"
End With

Stroka2 = ">ПРАВЛЕНО<"

    Open "C:\Users\17620635\Desktop\testxml.txt" For Input As #1 'Открываем файл функцией Open() на чтение(Input)
    Open "C:\Users\17620635\Desktop\outputxml.txt" For Output As #4
    
    While Not EOF(1)
        Line Input #1, s
        s = myRegExp.Replace(s, Stroka2)
        Print #4, s
    Wend
    
    MsgBox vbInformation
    Close #1
    Close #4
End Sub


Вообщем есть большой XML файл и код убирает внутри тегов значения ИНН, ОГРН, Телефона. Проблема в том, что в документе, в том же формате что и телефон указанны даты. (xx-xx-xx). Как бы паттерн для всей строки одинаковый и заменяемое значение одно и то же для любого найденного значения. Если бы это был Python, я бы сделал список с строками для замены по условию содержания возвращаемой патерном строки. (типо если есть INN, то вернуть первую подстроку списка).

Подскажите, как для разных выражений возвращать разные строки? Если можно на примере. По следущей логике.

Код
If pat = ">\d{10}<|>\d{12}<" Then:
StrN = "INN>ПРАВЛЕНО<"
ElseIf pat = ">\d{13}<|>\d{15}<" Then:
StrN = "OGRN>ПРАВЛЕНО<"
ElseIf pat = ">((8|\+7)[\- ]?)?(\(?\d{3}\)?[\- ]?)?[\d\- ]{7,10}<" Then:
StrN = "Telephone>ПРАВЛЕНО<"
Изменено: Argo9 - 13.11.2019 11:54:01
 
up
 
Argo9, здравствуйте! Сделайте файл-пример со строками "было" и "надо"
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
было
Код
        <ns1:Telephone>864581384547</ns1:Telephone>
        <ns1:Name>ООО Колобок</ns1:Name>
   <ns1:INN>4664444444</ns1:INN>
   <ns1:OGRN>46604444</ns1:OGRN>
   <ns1:PARTTYPE>UL</ns1:PARTTYPE>
   </ns1:CovGroupParticipant>

стало
Код
   <ns1:Telephone>ПРАВЛЕНО</ns1:Telephone>
   <ns1:Name>ООО Колобок</ns1:Name>
   <ns1:INN>ПРАВЛЕНО</ns1:INN>
   <ns1:OGRN>ПРАВЛЕНО</ns1:OGRN>
   <ns1:PARTTYPE>UL</ns1:PARTTYPE>
   </ns1:CovGroupParticipant>


по сути, хотелось бы опустошать определенные теги
Изменено: Argo9 - 13.11.2019 11:56:14
 
Цитата
Argo9 написал:
хотелось бы опустошать
странно, конечно, при сопоставлении "было" и "стало" сложилось впечатление, что надо дополнять. Даже визуально данных стало больше, чем было.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Argo9,
Цитата
Дмитрий(The_Prist) Щербаков: сложилось впечатление, что надо дополнять
вот да. Словами расскажите, по каким правилам вы хотите заменять/удалять данные. И фразу файл-пример вы явно не поняли…
Изменено: Jack Famous - 13.11.2019 12:01:34
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
файл выгрузить вообще не могу никакой, к сожалению. Два кода выше (я их изменил), это по сути два текстовых документа. В входящем файле нужно заменять значения ИНН, ОГРН, Номера телефона на фразу "Замена"и выгружать в новый текстовый документ. Код в шапке с задачей справляется, но меняет кроме телефона и даты в документе. (так как они в такой же формате что и номер записываются).

Можно ли например сделать функцию, которая бы возвращала строку в зависимости от того какое регулярное выражение сработало. (например)
Изменено: Argo9 - 13.11.2019 12:02:59
 
Цитата
Argo9: файл выгрузить вообще не могу никакой, к сожалению
если вам лень самому сделать файл-пример, то не факт, что это будет интересно кому-то ещё + в приведённом "примере" нет дат, с которыми, по вашим словам можно спутать телефоны. Удачи!
Изменено: Jack Famous - 13.11.2019 12:03:08
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Jack Famous, мне не в коем случае не лень. Мне не позволяет его выгрузить система, сижу с рабочего компьютера. Нельзя выгружать ничего.
 
есть
Код
ns1:INN>2463081145</ns1:INN>
         <ns1:KPP>246301001</ns1:KPP>
         <ns1:OGRN>1062463059251</ns1:OGRN>
         <ns1:OKPO>95695648</ns1:OKPO>
         <ns1:DboDocNum>89</ns1:DboDocNum>
         <ns1:DboDocDate>2018-05-29</ns1:DboDocDate>

надо
Код
ns1:INN>Замена</ns1:INN>
         <ns1:KPP>246301001</ns1:KPP>
         <ns1:OGRN>Замена</ns1:OGRN>
         <ns1:OKPO>95695648</ns1:OKPO>
         <ns1:DboDocNum>89</ns1:DboDocNum>
         <ns1:DboDocDate>2018-05-29</ns1:DboDocDate>
Изменено: Argo9 - 13.11.2019 12:08:31
 
Argo9, вы прикалываетесь??? СТРОКИ ИЗ #4 СКОПИРУЙТЕ В ФАЙЛ EXCEL и добавьте даты, а то вам дадут решение, а вы "ой - а с датами всё ещё путает" - А ПОТОМУ ЧТО У ВАС В ПРИМЕРЕ ДАТ НЕТУ

Если нельзя загрузить файл-пример, то загрузите ссылку на файлообменник
Изменено: Jack Famous - 13.11.2019 12:11:55
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
В #4 Вы же данные вставили. Если нельзя выгрузить файл, то вставьте больше информации, скопировать ее в файл уже проще, чем самим все набирать
 
Как понял:
Код
Sub ReplaceMassRE()
   Dim sTxt$, sres$
   Dim oRE As Object
   Set oRE = CreateObject("VBScript.Regexp")
   oRE.ignorecase = True
   oRE.MultiLine = True
   oRE.Global = True
   oRE.Pattern = "(ns1\:(INN|OGRN))>(.+)<"
   sTxt = "<ns1:Name>ООО Колобок</ns1:Name>" & vbNewLine & _
   "<ns1:INN>4664444444</ns1:INN>" & vbNewLine & _
   "<ns1:OGRN>46604444</ns1:OGRN>" & vbNewLine & _
   "<ns1:PARTTYPE>UL</ns1:PARTTYPE>" & vbNewLine & _
   "</ns1:CovGroupParticipant>" & vbNewLine & _
   "</ns1:ListOfCovGroupParticipants>"
   
   sres = oRE.Replace(sTxt, "ns1:$2>ПРАВЛЕНО<")
   Debug.Print sres
End Sub
по сути останется только в эти скобки - (INN|OGRN) - вносить через прямую черту нужные теги и все.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо Дмитрий, я просто немного по другому представлял работу оператора "или".  Теперь все встало на свои места. Благодарю.

Jack Famous, вам тоже спасибо за попутку помочь. Мой вопрос как мне казалось был элементарным и понятным, поэтому думается файл пример не был так нужен.
bigorq, я не об этом, но и вам спасибо
Изменено: Argo9 - 13.11.2019 12:21:19
 
еще маленький вопрос. Если я подключил библиотеку. Пользователю макроса ее нужно будет каждый раз включать? Просто каждый раз открывая книгу, приходиться в ручную включать ее.
 
Вообще так быть не должно. Подключили библиотеку -Сохранили файл. Ссылка на подключенную библиотеку должна сохраниться.
Однако я привел код, который не требует подключения библиотеки в Tools -References, т.к. используется позднее связывание.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Страницы: 1
Наверх