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