Regex - Quantifier {x,y} ничего не следует

Я создаю простой текстовый редактор и использую регулярные выражения для выполнения функции поиска и замены. Для этого я получил этот код:

Private Function GetRegExpression() As Regex
    Dim result As Regex
    Dim regExString As [String]
    ' Get what the user entered
    If TabControl1.SelectedIndex = 0 Then
        regExString = txtbx_Find2.Text
    ElseIf TabControl1.SelectedIndex = 1 Then
        regExString = txtbx_Find.Text
    End If

    If chkMatchCase.Checked Then
        result = New Regex(regExString)
    Else
        result = New Regex(regExString, RegexOptions.IgnoreCase)
    End If

    Return result
End Function

И это метод Find

 Private Sub FindText()
    ''
    Dim WpfTest1 As New Spellpad.Tb
    Dim ElementHost1 As System.Windows.Forms.Integration.ElementHost = frm_Menu.Controls("ElementHost1")
    Dim TheTextBox As System.Windows.Controls.TextBox = CType(ElementHost1.Child, Tb).ctrl_TextBox
    ''
    ' Is this the first time find is called?
    ' Then make instances of RegEx and Match
    If isFirstFind Then
        regex = GetRegExpression()
        match = regex.Match(TheTextBox.Text)
        isFirstFind = False
    Else
        ' match.NextMatch() is also ok, except in Replace
        ' In replace as text is changing, it is necessary to
        ' find again
        'match = match.NextMatch();
        match = regex.Match(TheTextBox.Text, match.Index + 1)

    End If

    ' found a match?
    If match.Success Then
        ' then select it
        Dim row As Integer = TheTextBox.GetLineIndexFromCharacterIndex(TheTextBox.CaretIndex)
        MoveCaretToLine(TheTextBox, row + 1)
        TheTextBox.SelectionStart = match.Index
        TheTextBox.SelectionLength = match.Length

    Else
        If TabControl1.SelectedIndex = 0 Then
            MessageBox.Show([String].Format("Cannot find ""{0}""   ", txtbx_Find2.Text), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information)
        ElseIf TabControl1.SelectedIndex = 1 Then
            MessageBox.Show([String].Format("Cannot find ""{0}""   ", txtbx_Find.Text), Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Information)
        End If
        isFirstFind = True
    End If
End Sub

Когда я запускаю программу, я получаю ошибки:

  • За ?, parsing "?" - Quantifier {x,y} following nothing.; а также
  • За *, parsing "*" - Quantifier {x,y} following nothing.

Как будто я не могу использовать их, но мне действительно нужно. Как я могу решить эту проблему?

1 ответ

Решение

? а также * являются квантификаторами в регулярных выражениях:

  • ? используется, чтобы указать, что что-то необязательно, например b?au может соответствовать как bau а также au,
  • * означает, что группа, с которой он связан, может повторяться ноль, один или несколько раз: например, ba*u может купаться bu, bau, baau, baaaaaaaau,...

Сейчас большинство регулярных выражений используют {l,u} как третий образец с l нижняя граница количества повторений чего-либо, и u верхняя граница на количество вхождений. Так ? заменяется {0,1} а также * от {0,},

Теперь, если вы предоставляете их без каких-либо символов перед ними, очевидно, что синтаксический анализатор регулярных выражений не знает, что вы имеете в виду. Другими словами, если вы делаете (использовали csharp, но идеи вообще применимы)

$ csharp
Mono C# Shell, type "help;" for help

Enter statements below.
csharp> Regex r = new Regex("fo*bar");
csharp> r.Replace("Fooobar fooobar fbar fobar","<MATCH>");    
"Fooobar <MATCH> <MATCH> <MATCH>"
csharp> r.Replace("fooobar far qux fooobar quux fbar echo fobar","<MATCH>");
"<MATCH> far qux <MATCH> quux <MATCH> echo <MATCH>"

Если вы хотите выполнить " поиск и замену необработанного текста ", вы должны использовать string.Replace,

РЕДАКТИРОВАТЬ:

Другой способ их обработки - экранирование специальных символов регулярных выражений. Как ни странно, вы можете сделать это, заменив их регулярным выражением;).

Private Function GetRegExpression() As Regex
    Dim result As Regex
    Dim regExString As [String]
    ' Get what the user entered
    If TabControl1.SelectedIndex = 0 Then
        regExString = txtbx_Find2.Text
    ElseIf TabControl1.SelectedIndex = 1 Then
        regExString = txtbx_Find.Text
    End If

    'Added code
    Dim baseRegex As Regex = new Regex("[\\.$^{\[(|)*+?]")
    regExString = baseRegex.Replace(regExString,"\$0")
    'End added code

    If chkMatchCase.Checked Then
        result = New Regex(regExString)
    Else
        result = New Regex(regExString, RegexOptions.IgnoreCase)
    End If

    Return result
End Function
Другие вопросы по тегам