【问题标题】:Regex for multiple occurrences of specific words特定单词多次出现的正则表达式
【发布时间】:2018-05-29 16:47:00
【问题描述】:

你好

我正在尝试创建一个验证规则来检查正则表达式以仅接受特定的短语。正则表达式基于 Java。

以下是正确输入的示例:

  • 1OR2
  • 2
  • 1 OR 2 OR 15
  • ( 2OR3) AND 1
  • (12AND13 AND1)OR(4 AND5)
  • ((2AND3 AND 1)OR(4AND5))AND6
  • 但如果只有正则表达式可以接受类似的东西,我会很高兴:

    ())34AND(4

    我不知道如何创建一个正则表达式来检查括号是否正确打开和关闭(它们可以嵌套)。我认为不可能在正则表达式中检查它,因此对我已经在代码中制作的括号进行正确验证(堆栈实现)。在代码中,我对短语进行了第二步验证。

    我需要正则表达式做的就是检查短语中是否有这些特定的东西:

    允许出现多次的数字、圆括号、单词 AND 和 OR 以及空格。 它不应该接受字母或其他字符。 到目前为止,我设法创建的是:

    ^[0-9 \\(][0-9 \\(\\)]*

    还尝试添加类似:

    \\b(AND|OR)\\b

    在第二对括号内,但没有运气。

    我不知道如何更正它以添加 OR 和 AND 词。

    【问题讨论】:

    • 如果括号可以嵌套,那么正则表达式绝对是不适合这项工作的工具。正则表达式无法处理递归。听起来你想写一个解析器。

    标签: java regex validation salesforce apex


    【解决方案1】:

    我使用了以下内容并匹配了您提供的所有输入:

    ^[^\)][0-9 \( (AND|OR)]*$
    

    我假设您不想以 ) 开头,这就是我包含 ^[^\)] 的原因。

    如果您不知道,我使用https://www.regexpal.com 来检查我的正则表达式的代码。

    【讨论】:

    • 谢谢你的例子,这真的很有帮助
    • @Mikke 此模式无法正确验证相关短语。见:regex101.com/r/qF2H3X/1
    【解决方案2】:

    由于您有任意数量的嵌套元素,因此可以说使用正则表达式是不可能的。

    仅用于演示目的,这匹配零个或多个连词和一组括号:

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

    就是这样。添加更多的嵌套括号集和级别会导致复杂性呈指数级增长 - 直到它完全中断。

    Demo

    【讨论】:

    • 感谢这个复杂的例子,它表明不可能检查括号
    • @Mikke 是的,不幸的是。如果答案对您有帮助,请考虑支持/接受。
    猜你喜欢
    • 2016-06-18
    • 2021-04-20
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 1970-01-01
    • 2022-08-18
    • 1970-01-01
    • 2017-05-25
    相关资源
    最近更新 更多