为什么这两个正则表达式在 Notepad++ 中产生不同的结果?
背景
我正在用 Perl 为 Delphi 编写一个原始词法分析器。目的是提取词(标识符和关键字),因此不需要正确识别各种标记。
它的核心是以下正则表达式:
\{[^}]*\}|\(\*([^*]|\*[^\\])*?\*\)|[A-Za-z_]\w*|\d+|//.*?$|'([^']|'')*?'|\s+|.
我偶然发现行尾没有被行注释占用。所以我很好奇我是否可以修改正则表达式,以便完全由行注释组成的两个连续行被计为 2 个“令牌”。
// first line
// last line
我用这个正则表达式替换//.*?$
了//.*?\n
直接放在 EOF 之前的行注释(没有换行符)将不匹配,而是将其分解为/
,/
依此类推。所以我寻找正确的方式来正确表达交替。我发现两个在 Notepad++ 和 winGrep 中表现不同但在 Perl 中相同的正则表达式:
介绍性问题中已经显示了实际差异:
\{[^}]*\}|\(\*([^*]|\*[^\\])*?\*\)|[A-Za-z_]\w*|\d+|//.*?\n|//.*?$|'([^']|'')*?'|\s+|.
(上述示例源中有 2 个匹配项)\{[^}]*\}|\(\*([^*]|\*[^\\])*?\*\)|[A-Za-z_]\w*|\d+|//.*?(?:\n|$)|'([^']|'')*?'|\s+|.
(上述示例源中的 3 个匹配项)
可以在 Notepad++(7.7.1 32 位)和 grepWin(1.9.2 64 位)中观察到。在 Perl 中,我将正则表达式放在 和 之间m@(
,)@mg
两者都有 2 个匹配项。