Хакер писал(а):В общем, счётчик это не проблема, но я изначально обращался к FireFenix-у.
С чётностью была идея типа
- Код: Выделить всё
Dim Text As String = "Msgbox "" A ' B """" C """" D ' E "", F, ""G"" ', H ' I "" J ' """" K ' "" '"
Text &= ChrW(13) & ChrW(10) & "'Коммент1"
Text &= ChrW(13) & ChrW(10) & "MsgBox(""Hello!"") REM коммент2"
Text &= ChrW(13) & ChrW(10) & "Box(""H!"") 'ababa"
Text &= ChrW(13) & ChrW(10) & "REM коммент3"
Text &= ChrW(13) & ChrW(10) & "Console.WriteLine(1464) REM коммент3"
Dim Delims As Char() = {ChrW(13), ChrW(10)}
Dim Lines As String() = Text.Split(Delims, StringSplitOptions.RemoveEmptyEntries)
Dim Pos As Integer
Dim LastPos As Integer
Dim Comment As Integer
Dim Count As Integer
For i = 0 To Lines.Length - 1
LastPos = Lines(i).IndexOf("""", Pos)
If LastPos > -1 Then
Pos = Lines(i).IndexOf("""", LastPos + 1)
If Pos > 0 Then
Comment = Lines(i).IndexOf("REM ", 0, Pos, StringComparison.OrdinalIgnoreCase)
If Comment > -1 Then
Console.WriteLine("Comment! Pos=" & Comment & "| Line=" & i)
End If
End If
While Pos > -1 And Pos < Lines(i).Length - 1
LastPos = Lines(i).IndexOf("""", Pos + 1)
If LastPos > -1 Then
Comment = Lines(i).IndexOf("'", Pos, LastPos - Pos)
If Comment > -1 Then
Console.WriteLine("Comment! Pos=" & Comment & " | Line=" & i)
Else
Comment = Lines(i).IndexOf("REM ", Pos, LastPos - Pos, StringComparison.OrdinalIgnoreCase)
If Comment > -1 Then
Console.WriteLine("Comment! Pos=" & Comment & "| Line=" & i)
End If
End If
Else
Comment = Lines(i).IndexOf("'", Pos, Lines(i).Length - Pos - 1)
If Comment > -1 Then
Console.WriteLine("Comment! Pos=" & Comment & " | Line=" & i)
Else
Comment = Lines(i).IndexOf("REM ", Pos, Lines(i).Length - Pos - 1, StringComparison.OrdinalIgnoreCase)
If Comment > -1 Then
Console.WriteLine("Comment! Pos=" & Comment & "| Line=" & i)
End If
End If
Exit While
End If
Pos = Lines(i).IndexOf("""", LastPos + 1)
End While
ElseIf Lines(i).Substring(0, 3).ToUpper = "REM " Or Lines(i).Substring(0, 1).ToUpper = "'" Then
Console.WriteLine("Comment! Pos=0 | Line=" & i)
Else
Comment = Lines(i).IndexOf(" REM ", 0, Lines(i).Length - 1, StringComparison.OrdinalIgnoreCase)
If Comment > -1 Then
Console.WriteLine("Comment! Pos=" & Comment & " | Line=" & i)
End If
End If
Count = 0
Pos = 0
Comment = 0
Next
Но у Qwertiy прямой проход и меньше циклов => мой вариант не рационален (хотя, наверное в некоторых случаях может быть одинаковым по производительности)
Хакер писал(а):Пусть сделает это регулярками.
Ну на самом деле это ещё то извращение и не факт, что можно предопределить все исключающие конструкции, спецификой языка регулярок
По мне так, если уже работать с извращёнными конструкциями, так уже писать полноценный парсер, который разделит все сущности по спецификации