给定这个有限状态机,写一个 Python 正则表达式
Writing a Python regex given this finite state machine
我正在使用 PLY 在 Python 中编写 Java 词法分析器。
我有这个有限状态机:
它的目的应该是匹配某些代码中的所有行注释。我想构建一个 Python 正则表达式,完全符合这台机器的功能。
我要查找的正则表达式将写在一个名为 t_IGNORE_LINECOMMENT(t)
的方法中,这样,在进行词法分析时,每一行注释都将被忽略。
我发现的所有类似的正则表达式都有一些问题,像这样
(\/\/[^"\n\r]*(?:"[^"\n\r]*"[^"\n\r]*)*[\r\n]|\/\*([^*]|\*(?!\/))*?\*\/)(?=[^"]*(?:"[^"]*"[^"]*)*$)
可以测试here.
这个应该匹配每一种评论,但也可以匹配 "//"/"
而不能匹配 hey = "//comment" //comment "
,匹配所有 //comment" //comment "
作为评论而不仅仅是 //comment
在有限状态机中,我将所有字母称为 A
,当我写 A/{x,y}
时,我指的是除 x
和 y
之外的所有字母。
(?:[^"]|"(?:[^\"]|\.)*")*?(//.*?[\r\n])
应该做你想做的(给定 re.DOTALL
):它匹配尽可能少的非字符串字符或字符串(它们本身是任意数量的非引号非转义或转义),然后是 //
和尽可能少的字符直到下一个 EOL 字符。 (第一次非贪婪重复是必要的,才能使注释尽可能长。)
我正在使用 PLY 在 Python 中编写 Java 词法分析器。
我有这个有限状态机:
它的目的应该是匹配某些代码中的所有行注释。我想构建一个 Python 正则表达式,完全符合这台机器的功能。
我要查找的正则表达式将写在一个名为 t_IGNORE_LINECOMMENT(t)
的方法中,这样,在进行词法分析时,每一行注释都将被忽略。
我发现的所有类似的正则表达式都有一些问题,像这样
(\/\/[^"\n\r]*(?:"[^"\n\r]*"[^"\n\r]*)*[\r\n]|\/\*([^*]|\*(?!\/))*?\*\/)(?=[^"]*(?:"[^"]*"[^"]*)*$)
可以测试here.
这个应该匹配每一种评论,但也可以匹配 "//"/"
而不能匹配 hey = "//comment" //comment "
,匹配所有 //comment" //comment "
作为评论而不仅仅是 //comment
在有限状态机中,我将所有字母称为 A
,当我写 A/{x,y}
时,我指的是除 x
和 y
之外的所有字母。
(?:[^"]|"(?:[^\"]|\.)*")*?(//.*?[\r\n])
应该做你想做的(给定 re.DOTALL
):它匹配尽可能少的非字符串字符或字符串(它们本身是任意数量的非引号非转义或转义),然后是 //
和尽可能少的字符直到下一个 EOL 字符。 (第一次非贪婪重复是必要的,才能使注释尽可能长。)