1

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

过滤器应具有以下语法:

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 = >

所以问题在于它将运算符识别为“<”,将值识别为“>”,而不是正确地将运算符识别为“<>”并将值识别为“”(如果我用最火的 reg exp 对其进行测试,它正确将运算符识别为 <> 并将值识别为 "")

我想我应该告诉正则表达式贪婪地匹配运算符,但我认为默认情况下是这样的......

- 编辑

我刚刚在网上找到了这个 scala 控制台,为你测试正则表达式 http://www.simplyscala.com/

--

4

1 回答 1

3

他们很贪婪,是的,但这并不意味着他们可能不会回头。为此,您需要一个所有格量词

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

请注意,运算符中的交替顺序开始很重要......如果<替代出现在之前<=<>然后匹配引擎将始终<首先贪婪地匹配,然后甚至不尝试匹配更长的<=<>选项。如果您只是按长度从最长到最短对备选方案进行排序,那么您永远不会遇到这个问题。

于 2012-09-08T13:35:00.543 回答