使用regexp评估搜索查询

时间:2009-08-12 20:24:01

标签: regex search evaluate

是否可以转换正确形成的(在括号方面)表达式,例如

  

((a和b)或c)和d

进入Regex表达式并使用Java或其他语言的内置引擎,输入术语如ABCDE(不区分大小写......)?

到目前为止,我已经尝试了(b)(^。?)(a | e)*用于搜索b和(a或e)但是它不是真的很棒。我正在寻找它以匹配输入字符串中出现的字符'b'和'a'或'e'中的任何一个。

关于进程 - 我正在考虑将输入字符串拆分为一个数组(基于此正则表达式)并接收匹配的字符作为输出(如果不满足AND / OR条件则不接收)。我对Regex比较陌生,并且没有花很多时间在上面,所以如果我所询问的内容不可能或答案非常明显,我很抱歉。

感谢您的回复。

3 个答案:

答案 0 :(得分:1)

带有平衡括号的字符串语言不是常规语言,这意味着没有(纯)正则表达式会匹配它。

这是因为需要某种内存构造(通常是堆栈)来维护开括号。

也就是说,许多语言都提供regex中的递归评估,特别是Perl。我不知道详细的细节,但我不会打扰他们,因为你可以编写自己的解析器。

只需迭代字符串中的每个字符,并跟踪打开括号和一堆字符串的计数器。当你打开括号时,推入堆栈并将不是括号的字符放入堆栈的字符串中。当你得到一个封闭的括号时,评估你建立的表达式并将结果存储在堆栈顶部的字符串背面。

然后,我不完全确定我明白你在做什么。如果这没有帮助,我道歉。

答案 1 :(得分:1)

我不完全确定我明白你要做什么,但这里可能有所帮助。从

之类开始
((a and b) or c) and d

并通过这些替换声明:

s/or/|/g
s/and| //g
s/([^()|])/(?=.*$1)/g

那会给你

(((?=.*a)(?=.*b))|(?=.*c))(?=.*d)

这是一个符合你想要的正则表达式。

答案 2 :(得分:0)

没有。正则表达式在计算上不够强大,无法确保开括号和右括号匹配。你需要能够用正式语法描述它的东西。