Member 12692000 Ответов: 2

Как мне сопоставить функцию matchevaluator в моей программе?


Я пытаюсь найти регулярное выражение
pattern
и, если он совпадает, найдите, существует ли значение этого шаблона внутри любого тега формы "& lt;sec id= "sec123" " в файле. Если это так, я хочу заменить его на
result1
Я думаю, что это можно сделать с помощью функции MatchEvaluator, но я не могу понять, как ее применить.

Я новичок в этом деле. VB.NET (и программирование в целом) и действительно не знаю, что делать. Это то, что я пробовал до сих пор:

пример ввода:
<sec id="sec1">
<p>"You fig. 23 did?" I <xref ref-type="section" rid="sec12">section 12</a> asked, surprised.</p>
<p>"There are always better terms <xref ref-type="section" rid="sec6">section 6</a>, Richard!" my mom said sharply.</p>
<p>I <xref ref-type="section" rid="sec2">section 2</a> stood. I <xref ref-type="section" rid="sec2">section 2</a> had to hurry if I <xref ref-type="section" rid="sec1">section 1</a> was going to get to work on time.
<fig id="fig4">
<caption><p>I'm confused</p></caption>
</fig> 
</p>
<p>Turning to face her, I <xref ref-type="section" rid="sec2">section 2</a> walked backward. "I"ve seriously got to get ready. Why don"t we get together for lunch and talk more then?"</p>
<sec id="sec2">
<p>"You fig. 23 can"t be""</p>
<p>I <xref ref-type="section" rid="sec4">section 4</a> adored the Art Deco elegance of the Chrysler Building. I <xref ref-type="section" rid="sec2">section 2</a> could pinpoint my place on the island in relation to the posit table 9ion of the Empire State Building.</p>
<p>I <xref ref-type="section" rid="sec1">section 1</a> felt Gideon before I <xref ref-type="section" rid="sec1">section 1</a> saw him, my entire body humming wit table 9h awareness as he stepped out of the Bentley, which had pulled up behind the Benz.</p>
</sec>
</sec>


Я хочу, чтобы программа нашла все rid= " secX" элементы в файле и проверить, так ли это "secX" элемент присутствует внутри любого из выражений < sec id= "secX"> Во всем файле, и если есть несоответствие, то & lt;xref ref-type= "section" rid= "secX" & gt;section X< / a> будет удален. раздел x и это будет продолжаться, пока нет &ЛТ;б&ГТ;Рид="secX"&ЛТ;/б&ГТ;
выражение осталось проверить

Что я уже пробовал:

Dim pattern As String="(?<=rid=\"sec)(\\d+)(?=\">)"
Dim r As Regex = New Regex(pattern)
Dim m As Match = r.Match(input)
If (m.Success) Then
    Dim x As String=" id=""sec"+ pattern +""""
    Dim r2 As Regex = New Regex(x)
    Dim m2 As Match = r2.Match(input)
    If (m2.Success) Then
        Dim tgPat AsString="<xref ref-type="section" rid=""sec + pattern +"">(\w+) (\d+)</a>"
        Dim tgRep As String= "$1 $2"
        Dim tgReg As New Regex(tgPat)
        Dim result1 As String = tgReg.Replace(input, tgRep)
    Else
    EndIf
EndIf
Next

Patrice T

Вы должны показать, какой текст вы пытаетесь сопоставить и какой шаблон вы используете для замены.
Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.

Member 12692000

Я обновил свой вопрос, надеюсь, теперь я сделал требования программы намного яснее...

2 Ответов

Рейтинг:
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

Еще раз спасибо, вы мне очень помогли.

Рейтинг:
1

Patrice T

Каскадирование регулярных выражений таким образом-плохая идея; это неэффективно и подвержено ошибкам.
Если есть совпадение по третьему регулярному выражению, это означает, что было совпадение по второму регулярному выражению, которое подразумевает, что было совпадение по первому регулярному выражению. Сделать его 1 выражения.

Ошибка: Вы 3 паттерна используете 3 различных соглашения о написании, по крайней мере 2 неверны.
Ты должен показать:
- пример текста, который вы хотите сопоставить, а не то, что его содержит, просто точный текст.
- шаблон, который вы используете для соответствия этому тексту (без соблюдения правил VB).
- шаблон с использованием правил VB.
- результат, который вы хотите получить в замене.