I am developing an app with markdown capabilities, so I am building a lexer to handle this. I am fairly new to Flutter and have little experience with Regex in general.
Essentially there is a difference between *text*, **text**, and ***text***.
My expressions right now are:
r"\B\*[A-Za-z0-9 ] \*\B"
r"\B\*{2}[A-Za-z0-9 ] \*{2}\B"
r"\B\*{3}[A-Za-z0-9 ] \*{3}\B"
The issue is that the first expression is matching the other two. **text*** will get matched also with the second expression. Does anyone know how to solve this?
CodePudding user response:
It looks like you could use:
(?<!\S)(\*{1,3})[A-Za-z0-9 ] \1(?!\S)
See an online demo
(?<!\S)- Assert position is not preceded by anything that is not a whitespace char;(\*{1,3})- Match 1-3 asterisk characters;[A-Za-z0-9 ]- Match 1 characters from given character class;\1- Backreference what is matched in 1st group;(?!\S)- Assert position is not followed by anything other than whitespace char.
Note that if you'd remove the final negative lookahead you could also match **text** in **test*** if that is what you were after. Or even remove the leading negative lookbehind to match **text** in ****text** test
