【问题标题】:Regex for logic criteria [duplicate]逻辑标准的正则表达式 [重复]
【发布时间】:2013-07-02 07:16:51
【问题描述】:

我有一个输入文本框来输入逻辑标准。
以下是可能的输入:

1 OR 2
1 AND 2
(1 OR 2) AND 3
(1 OR 2) OR 3
(1 AND 2) AND 3
(1 AND 2) OR 3
1 AND (2 OR 3)
1 OR (2 OR 3)
1 AND (2 AND 3)
1 OR (2 AND 3)
(1 OR 2) AND (3 OR 4)
(1 OR 2) OR (3 OR 4)
(1 AND 2) OR (3 AND 4)
(1 OR 2) AND (3 OR 4) AND (5 OR 6)

谁能提供RegEx 来验证此类输入?

【问题讨论】:

  • (5 OR 6 AND 10 OR 6)怎么样
  • @Anirudh 这也是可能的
  • 你测试了什么?你试过什么?一定要试一试,而不是简单的找人来解决你的问题,先试着自己解决。
  • 这是一个有趣的问题,但没有明确说明。例如,1 等代表什么?这些真的是 1 位整数吗?可以嵌套 ((1 AND (2 OR 3)) OR 4) 吗?您为此使用哪种语言?另外,当解析器看起来更适合该任务时,为什么要使用正则表达式?
  • @sp00m:为什​​么不呢? Perl/PCRE、PHP、.NET 和其他正则表达式引擎支持递归就好了。

标签: regex


【解决方案1】:

假设您可以嵌套括号,则无法使用直接的正则表达式执行此操作,因为您无法使用正则表达式验证任意嵌套的括号。

验证此输入的更典型方法是将流程分为两个步骤。使用一系列正则表达式对输入进行标记,然后使用简单的语法来验证生成的标记序列。 yacc 支持的 LALR(1) 语法使这个问题变得微不足道。

我认为有一些扩展的正则表达式形式可以添加必要的功能,您可以匹配任意嵌套的括号。我必须承认我对它们中的任何一个都不太熟悉,因为它们很快就会变得比仅仅围绕一组更简单的匹配编写一些循环逻辑更复杂。

【讨论】:

    【解决方案2】:

    只匹配“1 and 2 or 4”,没有括号:

    ^\d+(?:\s*(?:AND|OR)\s*\d+)*$
    

    接下来,代替每个\d+,也允许相同的表达式,用括号括起来:

    ^(?:\d+|\(\d+(?:\s*(?:AND|OR)\s*\d+)*\))(?:\s*(?:AND|OR)\s*(?:\d+|\(\d+(?:\s*(?:AND|OR)\s*\d+)*\)))*$
    

    好的 - 它并不漂亮,但它有效。显然,这仅假设单级括号。
    正如 cmets 所说,根据您的语言和要求,您可能会找到更好的解决方案。

    工作示例:http://www.debuggex.com/r/eMBWubl5yAp6hUqQ

    【讨论】:

      【解决方案3】:

      您需要使用我的解决方案循环解析它。循环此正则表达式 (\({0,1}\d+ (OR|AND) \d+\){0,1}) 并将所有匹配值重新转换为数字(如 1)。直到文本中没有匹配 (\({0,1}\d+ (OR|AND) \d+\){0,1})。如果您只有数字,则该文本有效,否则无效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多