【问题标题】:Regular expression to match a comma not inside a string literal正则表达式匹配不在字符串文字内的逗号
【发布时间】:2012-07-13 22:54:23
【问题描述】:

在 BASIC 中,打印语句可能如下所示:

100 PRINT "Copyright, Adrian McMenamin","maybe"

应该在第一条语句和第二条语句之间放置一个制表符。

我正在为 Groovy/Java 中的 BASIC 开发 DSL/解释器,它需要解析这一行并生成如下内容:

print "Copyright, Adrian McMenamin", "    ","maybe"

(因为 Groovy 将逗号解释为仅分隔打印函数的参数。)

那么什么正则表达式可以区分不在引号内的逗号和在引号内​​的逗号(不用担心 PRINT 或行号等)?

【问题讨论】:

  • BASIC 语言中字符串的语法是什么?是否可以在字符串中使用转义引号?
  • 为什么不使用逗号进行标记,然后使用制表符加入生成的集合,而不是尝试使用正则表达式进行解析?
  • 是的,逗号可以出现在 BASIC 中的字符串文字中。标记点是一个很好的点。
  • 由于逗号可以出现在字符串中,因此,正如 Jack Maney 在他对以下答案的评论中指出的那样,您不能使用正则表达式。正则表达式可以处理任意嵌套和转义的引号(或括号,或 html 标签等)。无论您多么想使用正则表达式来完成这项工作,它都无法处理。您可以编写一个迷你解析器,以便在需要处理字符串时运行
  • 马克,我看错了你的评论——实际上在 BASIC 中不可能以这种方式转义字符串中的字符(或者至少不能在这个中,Sinclair,BASIC。对此感到抱歉。

标签: java regex groovy basic


【解决方案1】:

您正在查看正则表达式无法处理的parsinggrammar。通常,您需要计算超出正则表达式范围的左括号或右括号。你可能想看看像ANTLR 这样解决这个问题的解析器。 对于这个任务来说可能是矫枉过正,但我想你必须翻译多种类型的基本语句,然后解析器才是你真正需要的,而不是正则表达式。

【讨论】:

  • 我知道正则表达式无法计数,但它可以递归匹配未处理的块。我没有使用解析器,因为我不知道怎么做,而且看起来有点矫枉过正!
  • 不,这不是矫枉过正。 "For example, strings can have \"escaped quotes, and a lot more!\"".
  • (在正式正则表达式的范围之外,但不在[所有]“正则表达式”实现的范围之外.. 有一些 非常可怕 perl 示例,我认为“递归正则表达式”可以处理这个问题,但这种魔法超出了我的范围。无论如何,一个一般的 +1 答案。)
【解决方案2】:

我实现了一个非常简单的解析器,它只计算开引号(模 2)。考虑到 BASIC 字符串文字的简单规则,它就可以工作。 我设计了一个非常漂亮的递归函数,它使用了一个可以正常工作的正则表达式:

100 PRINT "Copyright, 2012", "Adrian McMenamin"

但这失败了:

100 PRINT "Copyright, 2012"

哦,好吧,这只是类似 DFA 的方案的限制。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 2017-09-15
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多