Regex 在括号外用逗号标记
我正在拼命尝试标记具有以下格式的筛选器字符串:Regex 在括号外用逗号标记,regex,go,Regex,Go,我正在拼命尝试标记具有以下格式的筛选器字符串: price:gte:5.99,price:lte:10.00,model:in:[test1,test2] 陷阱在于逗号不仅用于分隔过滤器选项,还用作选项列表的分隔符:[test1,test2] 应用标准的正则表达式标记器表达式[^,]+可以得到: price:gte:5.99 price:lte:10.00 model:in:[test1 test2] 但是,很明显,我想要: price:gte:5.99 price:lte:10.00 mo
price:gte:5.99,price:lte:10.00,model:in:[test1,test2]
陷阱在于逗号不仅用于分隔过滤器选项,还用作选项列表的分隔符:[test1,test2]
应用标准的正则表达式标记器表达式[^,]+
可以得到:
price:gte:5.99
price:lte:10.00
model:in:[test1
test2]
但是,很明显,我想要:
price:gte:5.99
price:lte:10.00
model:in:[test1,test2]
我怎样才能做到这一点呢?golang regex不支持lookaheads断言,这使得这项任务更加困难 您可以使用以下替代方式使用此正则表达式:
[^][,]*(?:\[[^][]*\])+|[^,]+
详细信息:
:匹配1+个字符,这些字符不是[^][,]+
和,
和[
]
:匹配(?:\[[^][]*\])+
或[
之间的文本。匹配此组中的一个或多个]
:或|
:匹配1+个非逗号字符[^,]+
[^][,]*(?:\[[^][]*\])+|[^,]+
详细信息:
:匹配1+个字符,这些字符不是[^][,]+
和,
和[
]
:匹配(?:\[[^][]*\])+
或[
之间的文本。匹配此组中的一个或多个]
:或|
:匹配1+个非逗号字符[^,]+
- 这可能是一个选项:
解释
(?: # Non capturing group
[^][,\n]+\[[^]]+\] # Match not a comma newline ] or [, then match between []
| # Or
[^,\n]+ # Match not a comma or a newline
) # Close non capturing group
(?:#非捕获组
[^][,\n]+\[^]+\]\不匹配逗号换行符]或[,然后在[]之间匹配
|#或
[^,\n]+#不匹配逗号或换行符
)#关闭非捕获组
编辑:
正如@anubhava所建议的,在字符类中添加了
][
,使其成为[^][,\n]
,以防止不必要的回溯。这可能是一个选项:
解释
(?: # Non capturing group
[^][,\n]+\[[^]]+\] # Match not a comma newline ] or [, then match between []
| # Or
[^,\n]+ # Match not a comma or a newline
) # Close non capturing group
(?:#非捕获组
[^][,\n]+\[^]+\]\不匹配逗号换行符]或[,然后在[]之间匹配
|#或
[^,\n]+#不匹配逗号或换行符
)#关闭非捕获组
编辑:
正如@anubhava建议的那样,在角色类中添加了
][
,这样就变成了[^][,\n]
,以防止不必要的回溯。Regex101游乐场链接是什么。你的regex风格是什么?@anubhava GolangRegex101游乐场链接是什么。你的regex风格是什么?@anubhava Golangex101谢谢,但这不适用于:model:in:[test1,test2],价格:gte:5.99,价格:lte:10.00
谢谢,但这不适用于:model:in:[test1,test2],price:gte:5.99,price:lte:10.00
谢谢,我会将你的答案标记为已接受,因为你是第一个使用有效解决方案的人。否则,@anubhava regex模式也适用于我。@AndrejsCainikovs:请不要将此评论视为冒犯性的评论,只是一个小的更正。我的工作编辑时间是在回答之前8秒:),但当然应该是这样OP有权接受任何答案。@anubhava:我期待着这样的评论。我能说什么?我真的很犹豫,但不幸的是,这样做的目的不是让我可以接受两个答案。我给第四只鸟一个优先选择,原因有两个:他首先发布了一个有效的解决方案,而此时他拥有6.7k的声誉,而不是472k你的。我不认为你有太多的声誉,不。这是你应得的,我非常尊重。但因为我是一个超级SO粉丝,激励那些名声不好或一般的人是我个人的特权。如果我可以建议的话,请在你的代码中使用(?:[^][,\n]+\[^]+\].[^,\n]+)
+开始时会导致大量大文本回溯。@anubhava关于回溯的评论非常有价值。谢谢你!谢谢,我会将你的答案标记为已接受,因为你是第一个提出有效解决方案的人。否则,@anubhava正则表达式模式也适用于我。@AndrejsCainikovs:请不要将此评论视为不正确ensive但只是一个小小的更正我的工作编辑在回答之前8秒:)但当然,OP有权接受任何答案。@anubhava:我期待着这样的评论。我能说什么?我真的很犹豫,但不幸的是,这样的设计不是为了让我可以接受两个答案。我给了第四只鸟一个p推荐理由有两个:他第一次发布了一个有效的解决方案,现在他有6.7k的声誉,而你的声誉是472k。我不认为你有太多的声誉,不。这是你应得的,我非常尊重。但因为我是一个超级超级粉丝,激励那些声誉不高或一般的人是我个人的特权。如果我可以的话建议,请在您的代码中使用(?:[^][,\n]+\[^]+\].[^,\n]+)
,因为[^,]+
一开始会导致大量大文本的回溯。@anubhava关于回溯的评论非常有价值。谢谢你!