给定这个有限状态机,写一个 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} 时,我指的是除 xy 之外的所有字母。

(?:[^"]|"(?:[^\"]|\.)*")*?(//.*?[\r\n])

应该做你想做的(给定 re.DOTALL):它匹配尽可能少的非字符串字符或字符串(它们本身是任意数量的非引号非转义或转义),然后是 // 和尽可能少的字符直到下一个 EOL 字符。 (第一次非贪婪重复是必要的,才能使注释尽可能长。)