Необычная проблема подсветки синтаксиса
Привет,
Я потратил довольно много времени на написание синтаксического маркера с использованием регулярных выражений.
Это разрешенные матчи:
1) String|int / boolean, а затем пробел (для объявления переменной, например. Строки mystring)
2) FilterableList & lt;String|int / boolean>
3) открытая скобка, либо ничего, либо (что-то, то пробел) "цитата" (либо ничего, либо пробел, то что-то) закрытая скобка, например (myString + " hello")
4) пробел, то +|-|*|/|==|&& или | / а затем пробел, например. 1 + 2
5) (или )
6) любое число 0-9
Это почти идеально работает, но есть несколько проблем. Видеть Regex Syntax Highlighter-альбом на Imgur[^]
1) вся цитата, включая"", должна быть желтой.
2) FilterableList&ЛТ;&ГТ; должно быть голубым, что внутри должен быть зеленым, если инт|последовательность|логические
3) одна из цитат имеет свой цвет полностью смещенным
4)) не красный.
Кажется, дело в том, что одни матчи мешают другим, есть идеи, как это преодолеть?
Private Sub updateCodeSyntaxHighlighting() allowCodeInput = False Dim prefix As String = "(?<return>" Dim suffix As String = ")( .*)?(?!.)" Dim listMatches As New Regex(prefix & "FilterableList<.*>" & suffix) Dim variableMatches As New Regex(prefix & "(int|String|boolean)|<(?<return>int|String|boolean)>" & suffix) Dim quoteMatches As New Regex("\((.* )?" & prefix & """.*"")( .*)?\)") Dim symbolMatches As New Regex(prefix & "( ([+\-/*]|==|&&|\|\|) )|\(|\))") Dim numberMatches As New Regex(prefix & "[0-9])") Dim selPos As Integer = codeEditorBox.SelectionStart Dim selPos2 As Integer = codeEditorBox.GetFirstCharIndexOfCurrentLine If Not codeEditorBox.Text = "" Then codeEditorBox.Select(0, codeEditorBox.Lines(codeEditorBox.GetLineFromCharIndex(selPos)).Length) codeEditorBox.SelectionStart = selPos2 codeEditorBox.SelectionColor = codeEditorBox.ForeColor codeEditorBox.SelectionStart = selPos End If For Each match As Match In listMatches.Matches(codeEditorBox.Text) highlight(match, selPos, Color.FromArgb(64, 255, 255)) Next For Each match As Match In variableMatches.Matches(codeEditorBox.Text) highlight(match, selPos, Color.FromArgb(64, 255, 64)) Next For Each match As Match In quoteMatches.Matches(codeEditorBox.Text) highlight(match, selPos, Color.FromArgb(255, 255, 64)) Next For Each match As Match In symbolMatches.Matches(codeEditorBox.Text) highlight(match, selPos, Color.FromArgb(255, 64, 64)) Next For Each match As Match In numberMatches.Matches(codeEditorBox.Text) highlight(match, selPos, Color.FromArgb(50, 155, 155)) Next codeEditorBox.SelectionLength = 0 allowCodeInput = True End Sub Private Sub highlight(match As Match, selPos As Integer, c As Color) Dim index As Integer = match.Index Dim length As Integer = match.Result("${return}").Length codeEditorBox.Select(index, length) codeEditorBox.SelectionColor = c codeEditorBox.SelectionStart = index + length codeEditorBox.SelectionColor = codeEditorBox.ForeColor codeEditorBox.SelectionStart = selPos End Sub
Что я уже пробовал:
Несколько генераторов регулярных выражений
-------------------------