正则表达式用于方法调用的字符串表示

时间:2017-08-23 21:22:12

标签: regex go

我有一个跟随特定模式的字符串 operator(field,value)

我希望使用正则表达式来提取运算符,字段和值的全部三个。我正在努力想出如何捕捉这些的语法。在这种情况下,值也可以是字母数字,例如

"contains(name, Joe)""lt(quantity, 2.5)"

2 个答案:

答案 0 :(得分:0)

我不了解golang,但我确实知道正则表达式,所以我会尽我所能。

您可能希望每个组都有#34;运算符","字段"和"值"。我现在要假设这些中的每一个都可以表示为字母,数字或下划线字符的任意组合,长度至少为一个字符。在正则表达式中,我们有一个快捷方式:\w表示单个字母数字或下划线字符,+修饰符表示"一个或多个"。所以\w+表示一行中有一个或多个这样的字符。如果您想要更复杂地定义这些字段的名称,我们将在您的问题中指明这一点。

你说你想支持"运营商(领域,价值)"。我在任何地方都没有空格,因为它更简单,你可以在运行正则表达式之前轻松删除所有空格。如果你需要,我们稍后会为正则表达式添加一些空白支持,但它会让生活变得困难。

要做到这一点,我们需要三个小组," 1(2,3)"其中1是运算符名称,2是字段名称,3是值名称。如上所述,这些中的每一个在我们的正则表达式中都是\w+。我们希望匹配开括号和近括号以及逗号,但我们会将它们丢弃,因为它们实际上只是分隔符。由于正则表达式对括号具有特殊含义,因此必须在正则表达式中转义括号。 The result looks like

(\w+)\((\w+),(\w+)\)
\ 1 /  \ 2 / \ 3 /

第二行显示每个组的定义位置。

如果您想支持某些空格,则需要在所有此类位置添加\s*。这会变得毛茸茸,but you can do it as such

(\w+)\s*\(\s*(\w+)\s*,\s*(\w+)\s*\)
\ 1 /        \ 2 /       \ 3 /

您举一个想要支持浮点值的示例,我也假设其他类型的值。您可以使用"或"来完成此操作。管道,|。例如,第3组可以定义为

,而不仅仅是\w+
[a-zA-Z_]\w*|\d+\.?|\d*\.\d+

此字符串将支持字母数字+下划线字符串,其中第一个字符必须是字母或下划线,或整数,或浮点(定义为在句子开头,中间或结尾处有句点的整数字符串)。显然,这可以继续支持更复杂的字符串值,但你明白了。

So the final regex might look like

(\w+)\s*\(\s*(\w+)\s*,\s*([a-zA-Z_]\w+|\d+\.?|\d*\.\d+)\s*\)

很抱歉没有给予任何golang帮助,我希望其他人可以编辑我的答案并填补这个主要差距。

答案 1 :(得分:0)

使用类似这样的东西捕获组,你可能想要限制[]接受的字符,注意在regexp中使用`和使用\ escaping for():

func main() {
    re := regexp.MustCompile(`(.+)\((.+),\s?(.+)\)`)
    for _, t := range tests {
        fmt.Println("result", re.FindStringSubmatch(t))
    }
}

https://play.golang.org/p/43YLTafgQt

输出:

result [contains(field, value) contains field value]
result [contains(name, Joe) contains name Joe]
result [lt(quantity, 2.5) lt quantity 2.5]
result [plus(no,44) plus no 44]

根据你想要的严格程度,你可以使用[a-z] +或类似的代替。+来匹配某些字符,但如果你不担心虚假值,这可能会很好。