Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Как составить регулярное выражение для удаления блока в XML - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как составить регулярное выражение для удаления блока в XML (Макросы/Sub)
Как составить регулярное выражение для удаления блока в XML
t330 Дата: Понедельник, 20.01.2020, 16:02 | Сообщение № 1
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Всем добрый день.

Помогите пожалуйста прописать регулярное выражение в строке 10 (там задается шаблон для поиска ) кода ниже, чтобы из XML списка артибутов ячейки можно было выудить и удалить весь блок между тегами <Worksheet > ... </Worksheet> ?

Если в строку 10 поставить шаблон для поиска просто "</Worksheet>" , то прога успешно отрабатывает и находит этот шаблон ,
если задать шаблон через регулярное выражение типа <Worksheet .*?<\/Worksheet> , чтобы найти весь блок , то не срабатывает...

[vba]
Код


Option Explicit

Sub RegExp()
Dim myRegExp As New RegExp ' создаем экземпляр RegExp
Dim aMatch As Match ' один из совпавших образцов
Dim colMatches As MatchCollection ' коллекция этих образцов
Dim strTest As String ' тестируемая строка
Dim c As String, b As Integer, a  As Integer, d As String
' устанавливаем свойства объекта RegExp
myRegExp.Global = False ' если Global = True, то поиск ведётся во всей строке, _
если False, то только до первого совпадения
myRegExp.IgnoreCase = True ' игнорировать регистр символов при поиске

10 myRegExp.Pattern = " <Worksheet.*?<\/Worksheet>" ' шаблон для поиска

strTest = Sheets("Прав").Range("A2").Value(11) ' присваиваем переменной XML текст из текущей ячейки
Set colMatches = myRegExp.Execute(strTest) ' получаем коллекцию совпадений с образцом

'перебираем коллекцию и просматриваем результаты
For Each aMatch In colMatches ' проходим по всей коллекции
a = aMatch.FirstIndex ' порядковый номер первого символа найденного образца
b = aMatch.Length ' кол-во символов в найденном образце
c = aMatch.Value ' полный образец
Next aMatch

'c = Mid(c, 6, Len(c) — 6)

Debug.Print a & " | " & b & " | " & c ' смотрим, что получилось

' производим замену найденного выражения
d = myRegExp.Replace(strTest, " здесь раньше был блок Worksheet")

Debug.Print d ' смотрим, что получилось

End Sub

[/vba]
К сообщению приложен файл: test.xlsm (23.7 Kb)
 
Ответить
СообщениеВсем добрый день.

Помогите пожалуйста прописать регулярное выражение в строке 10 (там задается шаблон для поиска ) кода ниже, чтобы из XML списка артибутов ячейки можно было выудить и удалить весь блок между тегами <Worksheet > ... </Worksheet> ?

Если в строку 10 поставить шаблон для поиска просто "</Worksheet>" , то прога успешно отрабатывает и находит этот шаблон ,
если задать шаблон через регулярное выражение типа <Worksheet .*?<\/Worksheet> , чтобы найти весь блок , то не срабатывает...

[vba]
Код


Option Explicit

Sub RegExp()
Dim myRegExp As New RegExp ' создаем экземпляр RegExp
Dim aMatch As Match ' один из совпавших образцов
Dim colMatches As MatchCollection ' коллекция этих образцов
Dim strTest As String ' тестируемая строка
Dim c As String, b As Integer, a  As Integer, d As String
' устанавливаем свойства объекта RegExp
myRegExp.Global = False ' если Global = True, то поиск ведётся во всей строке, _
если False, то только до первого совпадения
myRegExp.IgnoreCase = True ' игнорировать регистр символов при поиске

10 myRegExp.Pattern = " <Worksheet.*?<\/Worksheet>" ' шаблон для поиска

strTest = Sheets("Прав").Range("A2").Value(11) ' присваиваем переменной XML текст из текущей ячейки
Set colMatches = myRegExp.Execute(strTest) ' получаем коллекцию совпадений с образцом

'перебираем коллекцию и просматриваем результаты
For Each aMatch In colMatches ' проходим по всей коллекции
a = aMatch.FirstIndex ' порядковый номер первого символа найденного образца
b = aMatch.Length ' кол-во символов в найденном образце
c = aMatch.Value ' полный образец
Next aMatch

'c = Mid(c, 6, Len(c) — 6)

Debug.Print a & " | " & b & " | " & c ' смотрим, что получилось

' производим замену найденного выражения
d = myRegExp.Replace(strTest, " здесь раньше был блок Worksheet")

Debug.Print d ' смотрим, что получилось

End Sub

[/vba]

Автор - t330
Дата добавления - 20.01.2020 в 16:02
Gustav Дата: Понедельник, 20.01.2020, 18:49 | Сообщение № 2
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2731
Репутация: 1132 ±
Замечаний: 0% ±

начинал с Excel 4.0, видел 2.1
Вот такой шаблон сделайте, т.е. альтернативу \s к точке добавьте:
[vba]
Код
myRegExp.Pattern = "<Worksheet(.|\s)*<\/Worksheet>" ' шаблон для поиска
[/vba]
Одна точка не матчит переводы строк, а вкупе с этим ключом - да.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Понедельник, 20.01.2020, 18:50
 
Ответить
СообщениеВот такой шаблон сделайте, т.е. альтернативу \s к точке добавьте:
[vba]
Код
myRegExp.Pattern = "<Worksheet(.|\s)*<\/Worksheet>" ' шаблон для поиска
[/vba]
Одна точка не матчит переводы строк, а вкупе с этим ключом - да.

Автор - Gustav
Дата добавления - 20.01.2020 в 18:49
anvg Дата: Понедельник, 20.01.2020, 21:10 | Сообщение № 3
Группа: Друзья
Ранг: Ветеран
Сообщений: 581
Репутация: 271 ±
Замечаний: 0% ±

2016, 365
Доброе время суток.
Вариант
[vba]
Код
Public Function GetWithoutBetweenWorksheetTags(ByVal InText As String) As String
    Dim pReg As Object
    Set pReg = CreateObject("VBScript.RegExp")
    pReg.Global = True: pReg.IgnoreCase = True
    pReg.Pattern = "(<worksheet ?>)[\S\s]*?(?=</worksheet>)"
    GetWithoutBetweenWorksheetTags = pReg.Replace(InText, "$1")
End Function
[/vba]
 
Ответить
СообщениеДоброе время суток.
Вариант
[vba]
Код
Public Function GetWithoutBetweenWorksheetTags(ByVal InText As String) As String
    Dim pReg As Object
    Set pReg = CreateObject("VBScript.RegExp")
    pReg.Global = True: pReg.IgnoreCase = True
    pReg.Pattern = "(<worksheet ?>)[\S\s]*?(?=</worksheet>)"
    GetWithoutBetweenWorksheetTags = pReg.Replace(InText, "$1")
End Function
[/vba]

Автор - anvg
Дата добавления - 20.01.2020 в 21:10
t330 Дата: Понедельник, 20.01.2020, 23:27 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Одна точка не матчит переводы строк, а вкупе с этим ключом - да.


Спасибо, сработало!
 
Ответить
Сообщение
Одна точка не матчит переводы строк, а вкупе с этим ключом - да.


Спасибо, сработало!

Автор - t330
Дата добавления - 20.01.2020 в 23:27
t330 Дата: Понедельник, 20.01.2020, 23:29 | Сообщение № 5
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 147
Репутация: 0 ±
Замечаний: 20% ±

Excel 2016
Доброе время суток.
Вариант


Спасибо за функцию!
Правда она сработала только если заменить в коде шаблон на вариант предложенный Gustav
<Worksheet(.|\s)*<\/Worksheet>

По другому не срабатывает.
К сообщению приложен файл: 8276543.xlsm (25.1 Kb)
 
Ответить
Сообщение
Доброе время суток.
Вариант


Спасибо за функцию!
Правда она сработала только если заменить в коде шаблон на вариант предложенный Gustav
<Worksheet(.|\s)*<\/Worksheet>

По другому не срабатывает.

Автор - t330
Дата добавления - 20.01.2020 в 23:29
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Как составить регулярное выражение для удаления блока в XML (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!