re2c:尝试匹配字符串时出现语法错误

re2c: syntax error when trying to match string

我正在尝试使用 re2c,但它在这个正则表达式上给我一个语法错误:

(["'])((\{2})*|(.*?[^\](\{2})*))

有什么问题吗?这应该匹配双引号或单引号字符串

Re2c 与大多数扫描仪生成器一样,仅实现正则表达式原语,可以在线性时间内实现而无需回溯。因此,它 not 实现反向引用、捕获(尽管您可以将标记标记插入正则表达式)或非贪婪匹配。 (从技术上讲,非贪婪匹配可以在线性时间内实现。但要做到这一点有点棘手。)

正则表达式中的反向引用实际上只是一个缩写,因为它只能取两个值:["][']。将两个备选方案分开也可以很容易地避免对非贪婪匹配的需要:

  1. 如果不允许在字符串中换行:

    ["]([^"\\n]|\.)*["]|[']([^'\\n]|\.)*[']
    
  2. 如果仅在转义后才允许在字符串中换行:

    ["]([^"\\n]|\(.|\n))*["]|[']([^'\\n]|\(.|\n))*[']
    
  3. 如果允许在字符串中的任何位置换行:

    ["]([^"\]|\(.|\n))*["]|[']([^'\]|\(.|\n))*[']
    

(与 flex 一样,re2c 认为 . 匹配除换行符以外的任何字符,而否定字符 classes 确实包括换行符,除非特别提及。因此换行符处理通常需要明确。 )

请注意,re2c 确实实现了带引号的文字字符串(如 flex),因此 "' 是元字符,该功能出现在极少数正则表达式库中。 (与 flex 不同,单引号字符串被接受并视为不区分大小写。在 flex 中,单引号不是元字符。)结果是您必须对它们进行转义以使其成为文字字符;通常的惯例是将它们放在一个字符 class 中,而不是使用难以阅读的落木表示法。

请阅读 documentation for re2c patterns,它可能与您习惯使用的正则表达式库(或您在网络搜索中找到的示例)有一些显着差异。