0

是否可以转换格式正确(就括号而言)的表达式,例如

((a 和 b) 或 c) 和 d

转换为正则表达式并使用 Java 或其他语言的内置引擎以及输入项,例如 ABCDE(不区分大小写...)?

到目前为止,我已经按照 (b) (^.?) (a|e)* 的方式尝试了搜索 b 和 (a 或 e) 的方法,但它并没有真正奏效。我正在寻找它来匹配输入字符串中出现的字符“b”和任何“a”或“e”。

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

感谢您的任何回复。

4

3 回答 3

1

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

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

也就是说,许多语言在正则表达式中提供递归评估,尤其是 Perl。我不知道细节,但我不会打扰它们,因为您可能可以编写自己的解析器。

只需遍历字符串中的每个字符并跟踪开括号的计数器和一堆字符串。当您到达一个开放的括号时,将堆栈推入并将不是括号的字符放入堆栈的字符串中。当你到达一个闭括号时,计算你建立的表达式并将结果存储到堆栈顶部的字符串的后面。

再说一次,我不完全确定我理解你在做什么。那么,如果这没有帮助,我很抱歉。

于 2009-08-12T20:37:51.770 回答
1

我不完全确定我理解你想要做什么,但这里有一些可能会有所帮助。从类似的东西开始

((a 和 b) 或 c) 和 d

并通过这些替换语句传递它:

s/或/|/g
s/和| //G
s/([^()|])/(?=.*$1)/g

那会给你

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

这是一个匹配你想要的正则表达式。

于 2009-08-12T21:01:11.113 回答
0

不,正则表达式的计算能力不足以确保左括号和右括号匹配。您需要可以使用正式语法来描述它的东西。

于 2009-08-12T20:35:32.320 回答