我正在尝试实现某种动态过滤。
假设我有一个对象集合。每个对象都有相同的键但不同的值。
例如:
{
"state":"time out",
"displayState": "error"
}
我想按照从字符串中提取的模式对它们进行过滤和分类。
例如(完全没有意义,只是推断):
"displayState=error&(state!=aborted|(state=cancelled&state=timed out))"
我认为检测该字符串的最佳方法是通过正则表达式。能够捕获组、操作数和运算符
([^|&!()=<>]*)([=!<>]{1,2})([^|&!()=<>]*)(?:([|&])\(?([^|!&()=<>]*)([=!<>]{1,2})([^|&!()=<>]*)\)?)?
它是基本的和线性的,我对正则表达式的了解是有限的,所以它没有做我需要的事情。
基本上我正在尝试按 ()
进行分组首先是 [.*][=><!][.*]
。
在同一进程中捕获组、操作数和运算符。
- 编辑-
感谢Aniket's answer我能够走得更远。
如上所述in these answers ,正则表达式不能进行递归,至少在 Javascript 中不能。
因此组由 ()
分隔仅通过正则表达式无法隔离,需要一些逻辑。
我已查看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 工作流程。
一旦它正常工作,我将发布我的解决方案。
最佳答案
这是我能想到的:
([\&\|\(]+)?([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
计算这个相当简单,因为您可以从检查并打开 (
开始,如果找到一个,那么您就知道它前面的表达式将包含在其中。
我知道这不是一个很好的解决方案,但它可能会有所帮助。
关于javascript - 使用 RegExp 过滤字符串中的条件和组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26310322/