tags:

views:

1112

answers:

2

I have a syntax highlighting function in vb.net. I use regular expressions to match "!IF" for instance and then color it blue. This works perfect until I tried to figure out how to do comments.

The language I'm writing this for a comment can either be if the line starts with a single quote ' OR if anywhere in the line there is two single quotes

'this line is a comment
!if StackOverflow = "AWESOME" ''this is also a comment

Now i know how to see if it starts with a single line ^' but i need to to return the string all the way to the end of the line so i can color the entire comment green and not just the single quotes.

You shouldn't need the code but here is a snippet just in case it helps.

    For Each pass In frmColors.lbRegExps.Items
        RegExp = System.Text.RegularExpressions.Regex.Matches(LCase(rtbMain.Text), LCase(pass))
        For Each RegExpMatch In RegExp
            rtbMain.Select(RegExpMatch.Index, RegExpMatch.Length)
            rtbMain.SelectionColor = ColorTranslator.FromHtml(frmColors.lbHexColors.Items(PassNumber))
        Next
        PassNumber += 1
    Next
+4  A: 

Something along the lines of:

^(\'[^\r\n]+)$|(''[^\r\n]+)$

should give you the commented line (of part of the line) in group n° 1

Actually, you do not even need group

^\'[^\r\n]+$|''[^\r\n]+$

If it finds something, it is a comment.

"(^'|'').*$"

mentioned by Boaz would work if applied only line by line (which may be your case).
For multi-line detection, you must be sure to avoid the 'Dotall' mode, where '.' stands also for \r and \n characters. Otherwise that pattern would match both your lines entirely.

That is why I generally prefer [^\r\n] to '.': it avoids any dependency to the mode of the pattern. Even in 'Dotall' mode, it still works and avoids trying any match on the next line.

VonC
A: 

While the above would work you can simplify it:

"(^'|'').*$"

As VonC mentions - this would only work if you feed the Regex one line at a time. For multi line mode use:

"(^'|'').*?$"

The ? makes the * operator not be greedy , forcing the regex to match a single line.

Boaz
It only works if you apply it line by line. If applied to multiple lines, since '*' is a greedy quantifier, your '.' would go over line to match only comments of the second line, not the first.
VonC