使用RegExp过滤字符串中的条件和组

时间:2014-10-11 02:07:26

标签: javascript regex string

我正在尝试实施某种动态过滤。

假设我有一组对象。每个对象具有相同的键但具有不同的值。

前:

{
    "state":"time out",
    "displayState": "error"
}

我想按照从字符串中提取的模式对它们进行过滤和分类。

Ex(没有任何意义,只是外推):

"displayState=error&(state!=aborted|(state=cancelled&state=timed out))"

我认为检测此字符串的最佳方法是通过正则表达式。能够捕获组,操作数和操作符

Here's what I have for now

([^|&!()=<>]*)([=!<>]{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工作流程。

一旦它正常工作,我会发布我的解决方案。

1 个答案:

答案 0 :(得分:1)

这是我能够提出的:

([\&\|\(]+)?([a-zA-Z0-9 ]*)([!=<>]+)([a-zA-Z0-9 ]*)

http://www.regexr.com/39mfq

这将为您提供组,操作数和运算符。这里有一个警告,它只能抓住第一个左括号,所以你可以自己添加结束的那些检查构造的组。

假设我有这个字符串

"displayState=error&(state!=aborted|(state=cancelled&state=timed out))"

从上面给出的正则表达式,我将得到以下组:

displayState
=
error

&(
state
!=
aborted

|(
state
=
cancelled

&
state
=
timed out

计算它非常简单,因为你可以先检查并打开(,如果找到一个,那么你就知道它前面的表达式会被包含在其中。

我知道这不是一个很好的解决方案,但它可能有所帮助。

相关问题