使用正则表达式解析过滤条件

时间:2012-09-08 13:15:52

标签: regex scala regex-greedy

我正在尝试使用正则表达式解析一个简单的过滤条件

过滤器应具有以下语法:

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/

-

1 个答案:

答案 0 :(得分:3)

贪婪,是的,但这并不意味着他们可能不会回溯。你需要possessive quantifier

试试这个:^(\w+)(!?)(=|:|<=|>=|<>|<|>){1}+(.+)$

请注意,运算符中的替换顺序开始变得重要......如果<替代方案出现在<=<>之前,那么匹配引擎将始终贪婪地匹配{{ 1}}首先,然后甚至不尝试匹配较长的<<=选项。如果你只是根据长度从最长到最短排序,你应该永远不会遇到这个问题。