我正在使用一个商业应用程序,它可以选择使用RegEx来验证字段格式。通常这很有效。但是,今天我面临验证以下字符串:引用带有简单算术运算符的字母数字代码(+ - / *)。显然问题是有时候用户会添加额外的空格(例如“FLR01”而不是“FLR01”),或者有其他拼写错误,例如不匹配的括号会导致下游处理问题。
第一个例子都添加了5个代码:
“FLR01” + “FLR02” + “FLR03” + “FMD01” + “FMR05”
所以我开始在匹配字符串引用的5个字母数字字符的路上:
“[0-9A-ZA-Z] {5}”[+ - * /
然而,公式很快变得更难,我不知道如何解决以下并发症:
有效:
"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的回答,我怀疑我至少失败了“匹配配对”问题。即使我无法解决括号问题,即使部分解决问题(例如标记额外空格,无效运算符)也可能比没有好。建议欢迎!
谢谢,
斯蒂芬
答案 0 :(得分:3)
如您所知,您无法检查匹配的括号与正则表达式。你需要更强大的东西,因为正则表达式无法记住状态并计算嵌套的括号。
这是一个足够简单的语法,您可以手动编写一个简单的解析器来计算括号,递增和递减计数器。你只需要确保计数器永远不会消极。
至于剩下的,这个怎么样?
("[0-9a-zA-Z]+"([+\-*/]"[0-9a-zA-Z]+")*)?
您也可以使用此正则表达式检查括号。它不会验证它们是否已正确嵌套,但它会验证打开和关闭的括号是否显示在正确的位置。添加上述计数器,你就有了一个合适的验证器。
(\(*"[0-9a-zA-Z]+"\)*([+\-*/]\(*"[0-9a-zA-Z]+"\)*)*)?
答案 1 :(得分:1)
您可以轻松使用正则表达式来匹配您的令牌(数字,运算符等),但您无法匹配平衡括号。这不是一个大问题,因为你只需要创建一个操作你匹配的标记的状态机。如果您不熟悉这些内容,请将其视为程序中的流程图,您可以在其中跟踪自己的位置以及可以去的位置。您还可以查看Wikipedia page。