我正在尝试实施某种动态过滤。
假设我有一组对象。每个对象具有相同的键但具有不同的值。
前:
{
"state":"time out",
"displayState": "error"
}
我想按照从字符串中提取的模式对它们进行过滤和分类。
Ex(没有任何意义,只是外推):
"displayState=error&(state!=aborted|(state=cancelled&state=timed out))"
我认为检测此字符串的最佳方法是通过正则表达式。能够捕获组,操作数和操作符
([^|&!()=<>]*)([=!<>]{1,2})([^|&!()=<>]*)(?:([|&])\(?([^|!&()=<>]*)([=!<>]{1,2})([^|&!()=<>]*)\)?)?
它是基本的和线性的,我在regexp中的知识是有限的,所以它没有做我需要的。
基本上我首先尝试按()
进行分组,然后按[.*][=><!][.*]
进行分组。
在同一过程中捕获组,操作数和运算符。
- 编辑 -
感谢Aniket's answer我能够进一步了解。
如上所述in these answers,正则表达式不能进行递归,至少在Javascript中不能。
因此()
分隔的组不能仅通过regexp隔离,并且需要一些逻辑。
我已审核Aniket's regexp以清理捕获量
/([&|])?\(*(([a-zA-Z0-9 ]*)([!=<>]+)([a-zA-Z0-9 ]*))\)*/g
将返回
0 : {
expression : displayState=error
type : undefined
operand1 : displayState
operator : =
operand2 : error
},
1 : {
expression : &(state!=aborted
type : &
operand1 : state
operator : !=
operand2 : aborted
},
2 : {
expression : |(state=cancelled
type : |
operand1 : state
operator : =
operand2 : cancelled
},
3 : {
expression : |state=timed out))
type : |
operand1 : state
operator : =
operand2 : timed out
}
我正在尝试使用javascript隔离组,并拥有完整的jsFiddle工作流程。
一旦它正常工作,我会发布我的解决方案。
答案 0 :(得分:1)
这是我能够提出的:
([\&\|\(]+)?([a-zA-Z0-9 ]*)([!=<>]+)([a-zA-Z0-9 ]*)
这将为您提供组,操作数和运算符。这里有一个警告,它只能抓住第一个左括号,所以你可以自己添加结束的那些检查构造的组。
假设我有这个字符串
"displayState=error&(state!=aborted|(state=cancelled&state=timed out))"
从上面给出的正则表达式,我将得到以下组:
displayState
=
error
&(
state
!=
aborted
|(
state
=
cancelled
&
state
=
timed out
计算它非常简单,因为你可以先检查并打开(
,如果找到一个,那么你就知道它前面的表达式会被包含在其中。
我知道这不是一个很好的解决方案,但它可能有所帮助。