【问题标题】:Regular expression, optional (opening) parenthesis but closing parenthesis should then be mandatory正则表达式,可选(左)括号,但右括号应该是强制性的
【发布时间】:2016-11-30 04:13:57
【问题描述】:

如果我创建了一个允许用户在我的应用程序中创建公式的正则表达式。我的正则表达式工作正常,但是我希望用户使用左括号和右括号。

我目前的正则表达式是:

(
    ^[(N|R)]:   //START WITH N: OR R:

    (?:
        (?:
            [-.0-9]+|BT|PT|PN|PR  //ALLOW 48.934, BT, PT, PN OR PR
        )
        (?:
            \+|\*|\-|\/ //ALLOW OPERATORS /,*,+ and -
        )
    )+ //REPEAT x TIMES

    (?:
        [-.0-9]+|BT|PT|PN|PR //MUST END WITH 48.934, BT, PT, PN OR PR
    )

    (?:
        :V //ADD MANDATORY :V
    )

    (?:
        [-.0-9]+ //CLOSE REGEX WITH NUMBER
    )
)

正则表达式当前工作的几个例子:

N:0.3*BT/PN*PR:V1
N:2000+PN/BT:V0.5
R:BT*PN-500:V2

我希望正则表达式与 () 一起使用,它目前没有几个示例:

N:(2000+PN)/BT:V0.5
R:BT*(PN-500):V2

我已经阅读了有关创建 if / else 结构的正面和负面前瞻性的信息,但我似乎无法找到适合我需要的逻辑。

如果有人能指导我正确的方向,不胜感激。

附:我正在使用 javascript 正则表达式引擎。

【问题讨论】:

标签: javascript php regex


【解决方案1】:

这是您的正则表达式的修改版本,它允许任意数量的匹配(但不是嵌套)括号(参见 regex101):

(?=
    [^()]*
    (\([^()]+\)[^()]*)*
    $
)

^[NR]:   //START WITH N: OR R:

(?:
    \(?(?:[-.0-9]+|BT|PT|PN|PR)\)? //ALLOW 48.934, BT, PT, PN OR PR
    [-+*\/]                        //ALLOW OPERATORS /,*,+ and -
    \(?(?:[-.0-9]+|BT|PT|PN|PR)\)? //ALLOW 48.934, BT, PT, PN OR PR
)+ //REPEAT x TIMES

(?:
    [-+*\/]                        //ALLOW OPERATORS /,*,+ and -
    (?:[-.0-9]+|BT|PT|PN|PR)       //ALLOW 48.934, BT, PT, PN OR PR
    \)?
)*`


:V //ADD MANDATORY :V
[-.0-9]+ //CLOSE REGEX WITH NUMBER

解释:

除了对[(N|R)] 和其他无关分组进行一些清理之外,主要的变化是在开头添加一个正向前瞻,以确保成对找到任何括号:

(?=
    [^()]*
    (\([^()]+\)[^()]*)*
    $
)

然后允许在每个数字或变量周围使用括号。

【讨论】:

    【解决方案2】:

    首先,您应该更改正则表达式^[NR]: 的第二行,因为[] 之间的几乎每个字符都是文字。这也算括号。

    那么我需要让你失望,有条件使用前瞻,但不是在我读到的 JavaScript 中。我不知道 XRegExp,也许我们只是希望它可以做到这一点。 if-else 应该是这样的:

    (?(?=\()[^)]*))
    基本语法:
    (?(?=RegExp)then|else)

    【讨论】:

      【解决方案3】:

      你不能直接使用括号,因为它已经对正则表达式有意义。因此,当您使用括号 '(' 时,请改用 '\('

      【讨论】:

        【解决方案4】:

        我认为你可以使用这样的正则表达式:

        /^[NR]:(([()0-9.-]+|BT|P[TNR])[*+/-]?)+:V[0-9.-]+$/
        

        [JavaScript Regex Demo]

        PCRE 版本中应该是:

        /^[NR]:(([()0-9\.-]+|BT|P[TNR])[*+\/-]?)+:V[0-9\.-]+$/
        

        注意:
        [] 用于匹配其中存在的单个字符,因此[NR] 将匹配NR,而PT|PN|PR 可以是P[TNR]

        【讨论】:

          猜你喜欢
          • 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
          相关资源
          最近更新 更多