繁体   English   中英

正则表达式,可选(开头)括号,但右括号应该是强制性的

[英]Regular expression, optional (opening) parenthesis but closing parenthesis should then be mandatory

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

我目前的正则表达式是:

(
    ^[(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结构,但我似乎无法找到适合我需要的逻辑。

非常感谢有人能指导我朝着正确的方向前进。

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

以下是正则表达式的修改版本,允许任意数量的匹配(但不是嵌套)parens(请参阅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)]和其他外来分组的一些清理之外,主要的变化是在一开始就添加一个积极的先行,以确保成对发现任何parens:

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

然后允许每个数字或变量周围的parens。

首先,您应该更改RegEx ^[NR]:的第二行^[NR]: ,因为[]之间几乎每个字符都是字面值。 这也算作括号。

然后我需要让你失望,有一些使用lookaheads的条件,但是在我阅读时没有在JavaScript中。 我不知道XRegExp,也许我们希望它可以做到这一点。 if-else应该是这样的:

(?(?=\()[^)]*))
基本语法:
  ((=正则表达式),那么|?其他人) 

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

/^[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]

您不能直接使用括号,因为它已经对正则表达式有意义。 所以当你使用括号'('使用'\\('代替。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM