0

我正在开发一个需要从 JavaScript 代码中删除注释的文件解析器。问题是它必须很聪明,所以它不会将 '//'字符串中的序列作为评论的开始。我有以下想法:

遍历行。首先查找序列,然后在行中查找所有用引号 (或)'//'包围的字符串,然后遍历所有字符串匹配项以检查序列是在其中一个字符串之内还是之外。如果它在他们之外,很明显这将是一个适当的评论开始。'"'//'

在以下行测试代码时(当然是更大的 js 文件的一部分):

document.getElementById("URL_LABEL").innerHTML="<a name=\"link\" href=\"http://"+url+"\" target=\"blank\">"+url+"</a>";

我遇到了问题。我的正则表达式代码:

re_strings=re.compile("""   "
                            (?:
                            \\.|
                            [^\\"]
                            )*
                            "
                            |
                            '
                            (?:
                                [^\\']|
                                \\.
                            )*
                            '
                            """,re.VERBOSE);


for s in re.finditer(re_strings,line):
            print(s.group(0))

在 python 3.2.3(和 3.1.4)中返回以下字符串:

"URL_LABEL"
"<a name=\"
" href=\"
"+url+"
" target=\"
">"
"</a>"

这显然是错误\"的,因为不应退出字符串。我已经调试我的正则表达式很长时间了,它不应该在这里退出。所以我在http://re-try.appspot.com/上使用了 RegexBuddy(与 Python 兼容)和Python 正则表达式测试器作为参考。最奇怪的是,除了我的代码之外,它们都返回相同的正确结果,即:

"URL_LABEL"
"<a name=\"link\" href=\"http://"
"\" target=\"blank\">"
"</a>"

我的问题是这些差异的原因是什么?我忽略了什么?我是 Python 和正则表达式的初学者,所以答案可能很简单......

PS我知道'//'可以使用一个更大的正则表达式来查找序列是否在字符串引号内。我已经尝试过并遇到了同样的问题。

PPS我想知道我做错了什么,为什么我的代码和正则表达式测试应用程序的行为存在差异,没有找到如何解析JavaScript代码的其他想法。

4

2 回答 2

2

您只需要使用原始字符串来创建正则表达式:

re_strings=re.compile(r"""   "
                             etc.
                             "
                        """,re.VERBOSE);

你得到它的方式\\.|[^\\"]变成了正则表达式\.|[^\"],它匹配一个文字点 ( .) 或任何不是引号 ( ") 的东西。将r前缀添加到字符串文字中,它会按您的预期工作。

在此处查看演示。(我还使用了一个原始字符串来确保反斜杠出现在目标字符串中。我不知道你在测试中是如何安排的,但反斜杠显然是存在的;问题是你的正则表达式中缺少它们。 )

于 2012-08-31T03:02:15.607 回答
1

不能用正则表达式处理匹配的引号......事实上你不能 保证任何匹配的任何东西对(尤其是嵌套对)......你需要一个更复杂的状态机(LLVM等......)

资料来源:很多 CS 课程...

另请参阅:Matching pair tag with regex以获得更详细的解释

我知道这不是你想听到的,但它基本上就是它的方式......是的,正则表达式的不同实现可以为正则表达式不能真正做的事情返回不同的结果

于 2012-08-30T22:52:47.140 回答