是否可以转换正确形成的(在括号方面)表达式,例如
((a和b)或c)和d
进入Regex表达式并使用Java或其他语言的内置引擎,输入术语如ABCDE(不区分大小写......)?
到目前为止,我已经尝试了(b)(^。?)(a | e)*用于搜索b和(a或e)但是它不是真的很棒。我正在寻找它以匹配输入字符串中出现的字符'b'和'a'或'e'中的任何一个。
关于进程 - 我正在考虑将输入字符串拆分为一个数组(基于此正则表达式)并接收匹配的字符作为输出(如果不满足AND / OR条件则不接收)。我对Regex比较陌生,并且没有花很多时间在上面,所以如果我所询问的内容不可能或答案非常明显,我很抱歉。
感谢您的回复。
答案 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)
没有。正则表达式在计算上不够强大,无法确保开括号和右括号匹配。你需要能够用正式语法描述它的东西。