是否有可能编写一个可以验证简单数学的正则表达式?

时间:2010-02-18 05:45:13

标签: regex

我正在使用一个商业应用程序,它可以选择使用RegEx来验证字段格式。通常这很有效。但是,今天我面临验证以下字符串:引用带有简单算术运算符的字母数字代码(+ - / *)。显然问题是有时候用户会添加额外的空格(例如“FLR01”而不是“FLR01”),或者有其他拼写错误,例如不匹配的括号会导致下游处理问题。

第一个例子都添加了5个代码:

“FLR01” + “FLR02” + “FLR03” + “FMD01” + “FMR05”

所以我开始在匹配字符串引用的5个字母数字字符的路上:

“[0-9A-ZA-Z] {5}”[+ - * /

然而,公式很快变得更难,我不知道如何解决以下并发症:

  1. 我需要测试每个代码之间的四个简单数学运算符之一(+ - * /),但不是在最后一个之后。
  2. 可以添加任意数量的代码,而不仅仅是上面示例中的五个。
  3. 封闭式括号可以(“X”+“Y”)/“2”
  4. 不匹配的括号不合适。
  5. 没有公式(例如空白)没问题。
  6. 有效:

    "FLR01"+"FLR02"+"FLR03"+"FMD01"+"FMR05"
    "0XT"+"1SEAL"+"1XT"+"23LSL"+"23NBL"  
    ("LS400"+"LT400")*"LC430"/("EL414"+"EL414R"+"LC407"+"LC407R"+"LC410"+"LC410R"+"LC420"+"LC420R")
    

    无效:

    " FLR01" +"FLR02"
    "FLR01"J"FLR02"
    ("FLR01"+"FLR02"
    

    这不是您可以使用RegExp轻松完成的事情吗?基于杰夫对230517的回答,我怀疑我至少失败了“匹配配对”问题。即使我无法解决括号问题,即使部分解决问题(例如标记额外空格,无效运算符)也可能比没有好。建议欢迎!

    谢谢,

    斯蒂芬

2 个答案:

答案 0 :(得分:3)

如您所知,您无法检查匹配的括号与正则表达式。你需要更强大的东西,因为正则表达式无法记住状态并计算嵌套的括号。

这是一个足够简单的语法,您可以手动编写一个简单的解析器来计算括号,递增和递减计数器。你只需要确保计数器永远不会消极。

至于剩下的,这个怎么样?

("[0-9a-zA-Z]+"([+\-*/]"[0-9a-zA-Z]+")*)?

您也可以使用此正则表达式检查括号。它不会验证它们是否已正确嵌套,但它会验证打开和关闭的括号是否显示在正确的位置。添加上述计数器,你就有了一个合适的验证器。

(\(*"[0-9a-zA-Z]+"\)*([+\-*/]\(*"[0-9a-zA-Z]+"\)*)*)?

答案 1 :(得分:1)

您可以轻松使用正则表达式来匹配您的令牌(数字,运算符等),但您无法匹配平衡括号。这不是一个大问题,因为你只需要创建一个操作你匹配的标记的状态机。如果您不熟悉这些内容,请将其视为程序中的流程图,您可以在其中跟踪自己的位置以及可以去的位置。您还可以查看Wikipedia page