我正在尝试使用正则表达式解析一个简单的过滤条件
过滤器应具有以下语法:
field=value
field:value
field!=value
field<>value
etc... (you get the idea)
我想出了以下内容(在scala中)
val FilterEntry = """^(\w+)(!?)(=|:|<=|>=|<>|<|>)(.*)$""".r
val FilterEntry(v1, v2, v3, v4) = "field!<>value"
v1: String = field
v2: String = !
v3: String = <>
v4: String = value
所以这是一个好的开始
现在我希望正则表达式在没有传递值时捕获(引发错误)
我试过这个(我让最后一组不可选)
val FilterEntry = """^(\w+)(!?)(=|:|<=|>=|<>|<|>)(.+)$""".r
val FilterEntry(v1, v2, v3, v4) = "field!<>"
v1: String = field
v2: String = !
v3: String = <
v4: String = >
所以问题是它将运营商识别为“&lt;”和值为“&gt;”而不是正确地将运算符识别为“&lt;&gt;”值为“”(如果我用firest reg exp测试它,它正确地将运算符识别为&lt;&gt;并将值作为“”)
我想我应该告诉正则表达式贪婪地匹配运算符,但我认为默认情况下就是这样......
- 编辑
我刚刚在网上找到了这个scala控制台,为你测试正则表达式 http://www.simplyscala.com/
-
答案 0 :(得分:3)
贪婪,是的,但这并不意味着他们可能不会回溯。你需要possessive quantifier。
试试这个:^(\w+)(!?)(=|:|<=|>=|<>|<|>){1}+(.+)$
请注意,运算符中的替换顺序开始变得重要......如果<
替代方案出现在<=
和<>
之前,那么匹配引擎将始终贪婪地匹配{{ 1}}首先,然后甚至不尝试匹配较长的<
或<=
选项。如果你只是根据长度从最长到最短排序,你应该永远不会遇到这个问题。