Member 13032047 Ответов: 4

Использовать регулярное выражение для поиска и замены числа после слова?


Привет! Я очень новичок в регулярных выражениях и уже несколько часов тестирую их, чтобы найти подходящее выражение? Я работаю в компании VB.NET язык, VS2015, Windows Forms, Win10.

Я действительно нашел регулярное выражение, которое, по-видимому, работает для того, что мне нужно на нескольких сайтах тестирования регулярных выражений (т. е. независимо извлекает значения picwgoal и pichgoal). Но, кажется, это не принято в моем проекте? Intellisense обвиняет что то свое ? нельзя использовать здесь? Затем \b отделяется таким образом, \ b... Я предполагаю, что либо вкус регулярного выражения не является правильным для VB.NET или я просто не знаю, как использовать это выражение?

Я работаю над решением, которое преобразует содержимое RTF в RichTextBox в код разметки RTF в отдельном RTB. Он также преобразует разметку RTF для отображения исходного документа RTF.

Моя цель состоит в том, чтобы извлечь оба значения picwgoal и pichgoal из приведенной ниже тестовой строки для отображения на 2 отдельных метках. Затем, используя числовое значение вверх/вниз, измените размер этих значений на процент, чтобы уменьшить изображение до нужного размера. Затем мне нужно заменить исходные значения picwgoal и pichgoal новыми значениями (т. е. в твипах), чтобы изменить размер/масштаб изображения до требуемого размера. Это работает вручную, но я хотел бы автоматизировать эту задачу!

Я попытался использовать регулярное выражение.Сопоставьте примеры, но проблема, похоже, заключается в самом регулярном выражении? То, что я думаю, что мне нужно сделать, но не знаю, как это сделать, это:

- Поиск picwgoal.
- Извлеките числовое значение (т. е. переменную), которое следует за ним.
- Масштабируйте значение вниз в соответствии с процентом ввода пользователем (т. е. используя числовое значение вверх/вниз).
- Замените исходное значение в разметке RTF новым уменьшенным значением.
- Повторите операцию для pichgoal (может быть, оба значения можно заменить в одной операции???).

Тестовая строка представляет собой частичную выдержку из кода разметки RTF для изображения и текста!

Если вы можете дать мне какие-либо указания или помочь в этом, я был бы очень признателен! Я планирую опубликовать решение, как только преодолею препятствия :-)

Спасибо!!!

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

' Step 1: create Regex.
Dim regex As Regex = New Regex("\d+")

 Step 2: call Match on Regex.
Dim match As Match = regex.Match(?:picwgoal)(\d+)

' Step 3: test the Success bool.
' ... If we have Success, write the Value.
If match.Success Then
    Console.WriteLine(match.Value)
End If



REGEX EXPRESSION: (?:picwgoal)(\d+)


TEST STRING:

{\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}\viewkind4\uc1\pard\f0\fs17{\pict\wmetafile8\picw20793\pich13968\picwgoal11788\pichgoal7919 010009000003f88109000000e28109000000050000000b0200000000050000000c0290363951e2

Member 13032047

Я экспериментирую с группами захвата, то есть "(picwgoal)(\d+)", которая правильно делит текст и числовое значение на две группы. Пара вопросов: 1. Это работает в VB.NET? 2. Как я могу извлечь вторую группу захвата (т. е. числовое значение)? Тексты picwgoal и pichgoal являются константами, но числовые значения, которые следуют за ними, изменяются в соответствии с изображением, из которого генерируется RTF-код! Поэтому я не могу использовать сравнительную строку? Мне нужно найти текст picwgoal и pichgoal в разметке RTF, а затем заменить следующее числовое значение новым числовым значением? Действительно был бы признателен за любую помощь в этом!!!

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

Member 13032047

Нашел способ игнорировать первую группу захвата, сделав вторую группу захвата группой 1 (https://regex101.com/). Итак, теперь вместо того, чтобы перечислять две группы в результатах, есть только одна группа (то есть числовое значение, которое я хочу). Выглядит хорошо, но все еще не знаете, как использовать это в коде???

Patrice T

А как насчет того, чтобы показать свой код ?

Member 13032047

Спасибо, Патрис! Я обновил код, показав один пример из нескольких, которые я пробовал. Я новичок в регулярном выражении и делаю всю работу, чтобы попытаться научиться! Однако люди в основном публикуют только регулярное выражение, которое они тестировали на тестерах регулярных выражений, не приводя пример использования этого выражения в реальном коде! Это делает его довольно трудным для изучения! Тестеры регулярных выражений тестируют выражения, но на самом деле не показывают никаких примеров кода. Например, выражение, которое я теперь поместил в код, работает на нескольких тестерах регулярных выражений, но как я могу заставить его работать в реальном коде???

4 Ответов

Рейтинг:
2

Patrice T

Всего лишь несколько интересных ссылок, которые помогут построить и отладить регулярное выражение.
Вот ссылка на документацию по регулярным выражениям:
perlre - perldoc.perl.org[^]
Вот ссылки на инструменты, помогающие создавать регулярные выражения и отлаживать их:
.Объем тестер регулярное выражение - регулярное выражение шторм[^]
Регулярное Средство Выражения Эспрессо [^]
RegExr: Learn, Build, & Test RegEx[^]
Онлайн-тестер регулярных выражений и отладчик: PHP, PCRE, Python, Golang и JavaScript[^]
Этот пример показывает вам регулярное выражение в виде красивого графика, который действительно полезен для понимания того, что делает регулярное выражение: Debuggex: онлайн-тестер визуальных регулярных выражений. JavaScript, Python и PCRE.[^]
Этот сайт также показывает регулярное выражение в красивом графике, но не может проверить, что соответствует регулярному выражению: Regexper[^]


Member 13032047

Еще раз привет, Патрис! Я очень ценю ценность тестеров регулярных выражений! Но, как я уже говорил выше, они не дают мне реального примера того, как использовать рабочее выражение, которое я протестировал? Как я уже упоминал в OriginalGriff, я работаю с неизвестным и не могу использовать статическую тестовую строку для проверки числового значения переменной??? Я протестировал регулярное выражение в своем коде выше, и на нескольких тестерах регулярных выражений оно работает! Но какой код мне нужно использовать, чтобы заставить выражение работать в реальном мире с неизвестными числовыми значениями переменных???

Рейтинг:
2

Member 13032047

Эй, ребята, я нашел какой-то код (то есть ниже), который примерно работает с регулярным выражением! Но у меня есть пара проблем: 1. я хочу включить оба значения picwgoal и pichgoal в один и тот же блок кода, но хотя я пытался изменить переменные кода, я не мог заставить это работать, не повторяя один и тот же блок кода дважды с разными переменными? 2. Этот код показывает мне два сообщения: например, picwgoal11788, затем 11788 и то же самое для pichgoal. Это правильное поведение, потому что оно показывает сообщения для полного совпадения и группы захвата 1. Но мне нужно только одно сообщение? Как я могу этого достичь?


'PROJECT: Regex.GetGroupNumbers Method
'SOURCE CODE: https://docs.microsoft.com/en-us/dotnet/api/system.text.regularexpressions.regex.getgroupnumbers?view=netcore-3.1
        

        Dim pattern As String = "(?:picwgoal)(\d+)"
        Dim input As String = RichTextBox2.Text

        Dim rgx As New Regex(pattern)
        Dim groupNumbers() As Integer = rgx.GetGroupNumbers()
        Dim m As Match = rgx.Match(input)
        If m.Success Then
            Console.WriteLine("Match: {0}", m.Value)
            For Each groupNumber In groupNumbers
                Dim name As String = rgx.GroupNameFromNumber(groupNumber)
                Dim number As Integer
                Console.WriteLine("   Group {0}{1}: '{2}'",
                              groupNumber,
                              If(Not String.IsNullOrEmpty(name) And
                              Not Int32.TryParse(name, number),
                                 " (" + name + ")", String.Empty),
                              m.Groups(groupNumber).Value)

                MsgBox(m.Groups(groupNumber).Value)
            Next
        End If


В поисковой консоли были:

Матч: picwgoal11788
Группа 0: 'picwgoal11788'
Группа 1: "11788"
Матч: pichgoal7919
Группа 0: "pichgoal7919"
Группа 1: '7919'


CHill60

Вы должны использовать ссылку "улучшить вопрос", чтобы добавить информацию в свой пост. Это вопрос а не решение

Рейтинг:
12

Member 13032047

Ребята, спасибо за вашу помощь! Я поиграл с приведенным выше кодом и наконец получил версию, которая работает! Смотреть ниже:

Dim pattern As String = "(?:picwgoal)(\d+)"
        Dim pattern2 As String = "(?:pichgoal)(\d+)"
        Dim input As String = RichTextBox2.Text

        Dim rgx As New Regex(pattern)
        Dim rgx2 As New Regex(pattern2)
        Dim groupNumbers() As Integer = rgx.GetGroupNumbers()
        Dim groupNumbers2() As Integer = rgx2.GetGroupNumbers()
        Dim m As Match = rgx.Match(input)
        Dim m2 As Match = rgx2.Match(input)
        If m.Success Then

            Label8.Text = ("Width (picwgoal): " & m.Value.Replace("picwgoal", ""))
            Label9.Text = ("Height (pichgoal): " & m2.Value.Replace("pichgoal", ""))

        End If


Рейтинг:
1

OriginalGriff

Цитата:
Нашел способ игнорировать первую группу захвата, сделав вторую группу захвата группой 1 (https://regex101.com/). Итак, теперь вместо того, чтобы перечислять две группы в результатах, есть только одна группа (то есть числовое значение, которое я хочу). Выглядит хорошо, но все еще не знаете, как использовать это в коде???

Простой: Регулярные выражения .NET Framework | Microsoft Docs[^ я покажу тебе, как это делается.
[Обновление]
Цитата:
Какое регулярное выражение мне нужно и как его использовать в реальном коде, который не зависит от статических данных???

Найдите такие учебники, как: VB.Net - Регулярные Выражения - Tutorialspoint[^]


Member 13032047

Thanks OriginalGriff! I took a look at the link you posted! However, I find the same problem with the examples given there as with the many examples I have already studied on other sites all of which generally depend on a "static" test string. The RTF code generated in the program I am creating is "dynamic" in the sense that each image and RTF text inserted into the program is different. Therefore, the RTF Markup generated will be different each time! The picwgoal and pichgoal statements are constants, but the digits (i.e. image width and height) following those statements are variable (and therefore unknown), i.e. a screenshot (bitmap) or an image from a webpage are smaller images and give one kind of result. Photos taken with a digital camera are much larger and the numerical format changes!!! I cannot write code using a regex expression which requires a static number in a test string to find and replace an unknown number??? Doesn't appear to be very simple??? How do I represent unknown digits??? How do I know how many digits will appear in the RTF markup??? What kind of REGEX expression do I need and how do I use it in real world code which doesn't depend on static data???