Рейтинг:
14
Richard Deeming
Что-то вроде этого должно сработать:
Dim xref As New Regex("<xref[^>]+rid=""(?<id>sec\d+)""[^>]*>(?<content>[^<]+)</xref>")
Dim result As String = xref.Replace(input, Function(match)
Dim sec As New Regex(" id=""" & match.Groups("id").Value & """")
Return If(sec.IsMatch(input), match.Value, match.Groups("content").Value)
End Function)
Тем не менее, вы должны дважды проверить свой ввод. Это почти похоже на HTML, за исключением того, что у вас есть отверстие
<xref>
бирка закрыта с помощью
</a>
тег, который не совпадает.
Если вход
является HTML, возможно, вам больше повезет с использованием HTML-парсера, такого как AngleSharp, для анализа и изменения документа.
Язык Регулярных Выражений-Краткий Справочник[
^]
AngleSharp-Главная[
^]
Member 12692000
@Richard не могли бы вы объяснить свой код более подробно? Я новичок в кодировании, поэтому мне будет гораздо легче понять, что на самом деле делает этот процесс, и, кстати, закрывающий тег будет " < / xref>", а не" </a>", мой плохой
Richard Deeming
1) Создайте регулярное выражение, чтобы найти все <xref>
теги rid
атрибут, содержащий sec
далее следуют какие-то цифры. Захват rid
значение атрибута и содержимое тега.
2) Замените совпадения с помощью функции оценки совпадений:
2а) создайте регулярное выражение, чтобы найти id
атрибут с тем же содержимым, что и сопоставленный rid
атрибут;
2b) если все входные данные содержат совпадение для этого выражения, верните внешнее <xref>
матч без изменений;
2С) В противном случае rid
указывает на раздел, который не существует, поэтому верните содержимое раздела. <xref>
метка;
Документация MSDN[^] объясняет, как работает оценщик совпадений.
Member 12692000
Я обновил свой полный код в соответствии с вашим методом, но он не работает, может быть, я сделал какие-то глупые ошибки в кодировании, так как я всего лишь новичок, вы можете мне помочь
Система Импорта.ИО
Система Импорта.Текст.RegularExpressions
Форма Публичного Класса 1
Частная суб обработчика button1_click(отправителя как объект, а равно EventArgs) обрабатывает кнопки button1.Щелчок
Если FolderBrowserDialog1.ShowDialog = DialogResult.Тогда ладно
TextBox1. Text = FolderBrowserDialog1.SelectedPath
Конец, Если
Конец Подводной Лодки
Private Sub Button2_Click (sender As Object, e As EventArgs) обрабатывает Button2. Click
Dim targetDirectory как строка
целевой - = текстовое поле textbox1.Текст
Dim txtFilesArray As String () = каталог.GetFiles(targetDirectory, "*. txt")
Для каждого txtFile в txtFilesArray
Dim FileInfo как новый FileInfo(txtFile)
Dim FileLocation As String = FileInfo.Полное имя
Тусклый ввод в виде строки = файл.ReadAllText(FileLocation)
Неярким узором в виде string = "(?&ЛТ;=удалить=\""сек) выражение(\D+)(?=\""&ГТ;)"
Dim r As Regex = новое регулярное выражение (шаблон)
Дим-м матче = Р.Матч(вход)
Дим внешних ссылок как новое регулярное выражение ("в<ссылка[^&ГТ;]+Рид=""(?&ЛТ;ИД&ГТ;ТРЦ\д+)""[^&ГТ;]*&ГТ;(?&ЛТ;содержание&ГТ;[^&ЛТ;]+)")
Dim result As String = xref. Replace(input, Function(match)
Дим сек как новое регулярное выражение(" код=""" &амп; м.Группы("идентификатор").Стоимость усилителя; """")
Вернуться если(сек.Выполняется(вход), матч.Значение, совпадение.Группы ("контент").Ценность)
Конечная Функция)
вход = результат
Файл.WriteAllText(FileLocation, input)
Следующий
Ящик для сообщений.Show ("процесс завершен")
Конец Подводной Лодки
Конец Класса
Richard Deeming
Ну, вы можете немного упростить код:
Dim targetDirectory As String = TextBox1.Text
Dim txtFilesArray As String() = Directory.GetFiles(targetDirectory, "*.txt")
For Each txtFile In txtFilesArray
Dim input As String = File.ReadAllText(txtFile)
Dim xref As New Regex("<xref[^>]+rid=""(?<id>sec\d+)""[^>]*>(?<content>[^<]+)</xref>")
Dim result As String = xref.Replace(input, Function(match)
Dim sec As New Regex(" id=""" & match.Groups("id").Value & """")
Return If(sec.IsMatch(input), match.Value, match.Groups("content").Value)
End Function)
File.WriteAllText(txtFile, result)
Next
Вы также пропустили закрытие </xref>
тег в регулярном выражении.
Все, что я могу вам сказать, это то, что код, который я опубликовал, работал на примере ввода, который вы предоставили. Если он не работает с файлами, которые вы используете,то они не имеют того же формата, что и образец ввода.
Member 12692000
Ну я получаю ошибку
Ошибка BC30518 разрешение перегрузки не удалось, так как ни одна доступная "замена" не может быть вызвана с этими аргументами:
"Public Overloads Function Replace (input As String, replacement As String) As String": лямбда-выражение не может быть преобразовано в "String", поскольку "String" не является типом делегата.
'Public перегружает функцию Replace (input As String, evaluator As MatchEvaluator) As String': 'm' не объявляется. Он может быть недоступен из-за своего уровня защиты.
&ЛТ;заранее Ланг="ВБ"и GT;Дим целевой-как строка = элемент textbox1.Текст
Dim txtFilesArray As String () = каталог.GetFiles(targetDirectory, "*. txt")
Для каждого txtFile в txtFilesArray
Тусклый ввод в виде строки = файл.ReadAllText(txtFile)
Дим внешних ссылок как новое регулярное выражение ("в<ссылка[^&ГТ;]+Рид=""(?&ЛТ;ИД&ГТ;ТРЦ\д+)""[^&ГТ;]*&ГТ;(?&ЛТ;содержание&ГТ;[^&ЛТ;]+)")
Dim result As String = xref. Replace(input, Function(match)
Dim sec как новое регулярное выражение ("id="" " & match.Группы ("id").Стоимость усилителя; """")
Вернуться если(сек.Выполняется(вход), матч.Значение, совпадение.Группы ("контент").Ценность)
Конечная Функция)
Файл.WriteAllText(txtFile, result)
Далее< / pre>
Richard Deeming
Извините, небольшая опечатка. То m.Groups
должно быть match.Groups
.
Я обновил свой ответ.
Member 12692000
Большое спасибо! Это работает.
Member 12692000
Не могли бы вы оказать мне последнюю услугу в связи с этой программой? Не могли бы вы объяснить мне, как Вернуться, Если оператор работает в этой программе то есть что делает каждый из них сек. IsMatch(вход), совпадение.Ценность и совпадение.Группы ("контент").Ценность что вы делаете в заявлении? Извини, что доставил тебе немного неприятностей.
Richard Deeming
То If
оператор[^] есть VB.NET это версия "тернарного оператора". Он вычисляет первый аргумент, чтобы увидеть, возвращается ли он True
или False
. Если первый аргумент возвращает True
, он вычисляет второй аргумент и возвращает результат. Если первый аргумент возвращает False
, он вычисляет третий аргумент и возвращает результат.
Это равносильно написанию:
If sec.IsMatch(input) Then
Return match.Value
Else
Return match.Groups("content").Value
End If
То IsMatch
функция[^] вернет True
если поставляемые входные данные совпадают с регулярным выражением.
match.Value
возвращает всю строку, которая была сопоставлена внешнему регулярному выражению.
match.Groups("content").Value
возвращает значение именованной группы "содержимое" ((?<content>[^<]+)
) из внешнего регулярного выражения. Это будет текст между Открытием и закрытием <xref>
теги.
Member 12692000
Еще раз спасибо, вы мне очень помогли.