如何使用正则表达式为我的词法分析器转义字符串文字?

时间:2018-05-22 21:02:58

标签: regex lexer

现在,我正在写一个词法分析器,我希望能够在考虑转义字符的同时匹配字符串令牌。

所以,我希望能够解析这样的事情:

  • 'Hello World'[', Hello World, ']
  • 'There\'s an apostrophe in here'[', There's an apostrophe in here, ']
  • 'This is a backslash: \\'[', This is a backslash: \, ']

目前,我有以下匹配字符串的正则规则:/^\s*(')(.*?)(')/s^\s*说明了前导空格,而(')(.*?)(')则匹配字符串3次:开放标记,字符串本身,最后是结束标记。一旦我识别了一个令牌,我就会将匹配的令牌推送到一个数组中,并从我正在使用的数据的开头删除完整的匹配。

我试图修改我的规则来解释逃脱的角色,但我还没有能够让它发挥作用,坦白说,我真的不知道从哪里去这里。我甚至为尝试什么而感到茫然。如果我检查反斜杠,它就不会为两个人工作。如果我检查两个,它就不会工作三个等等。

有人可以让我走上正确的道路来实现这个目标吗?除此之外,我的词法分析器已经完成并完成它必须做的事情。这是唯一剩下的东西。

1 个答案:

答案 0 :(得分:1)

您可以使用

/^\s*(')([^'\\]*(?:\\.[^'\\]*)*)(')/s

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • \s* - 0+空白字符
  • (') - 捕获第1组:'字符
  • ([^'\\]*(?:\\.[^'\\]*)*) - 捕获第2组:
    • [^'\\]* - 除'\
    • 以外的0个字符
    • (?:\\.[^'\\]*)* - 重复0次或以上:
      • \\. - \后跟任何字符
      • [^'\\]* - 除'\
      • 以外的0个字符
  • (') - 捕获第3组:'