【发布时间】:2019-11-27 15:20:38
【问题描述】:
假设我有一个正则表达式 A 和另一个正则表达式 B 作为输入。我想创建一个新的正则表达式 C 匹配一行当且仅当
- A 匹配该行并且
- B 与该行不匹配。
我可以为 A 和 B 的非常简单的情况手动创建 C:比方说 A是 x 并且 B 是 y,那么 C = ^[^y]*x[^y]*$ 将是一个有效的解决方案。
显然,随着 A 和 B 变得越来越复杂,问题变得越来越困难。有没有一种通用算法可以从 A 和 B 中创建这样的正则表达式 C?
注意:由于regular languages are closed under intersection and complement,理论上应该存在这样的算法。我知道现代 IT 系统中可用的正则表达式的表达能力超过了正式的正则语言,但是 A 和 B 仅限于功能子集的解决方案在正式语言中可用,但 C 使用现代正则表达式引擎的扩展功能,对我来说非常好。
【问题讨论】:
-
你可以试试
^(?!B)A$,但它确实可能取决于实际的正则表达式:^(?!y)x$ -
如果
y是x的子字符串,在您的示例中会发生什么?我认为只有当存在不相交的匹配时,您的方法才有效。虽然理论上应该可以进行转换,但我认为用两个不同的模式结合布尔结果(/A/.test(string) and not (/B/.test(string))in pseudo-syntax)测试一个字符串会更容易。
标签: regex algorithm combinatorics theory