如何在Java中执行两个命名的正则表达式字符类的交集?

时间:2015-04-04 06:11:05

标签: java regex intersection

我知道如何找到从这个link到Java教程的两个常量集的交集。

示例:

 [0-9&&[345]]

将生成一个字符类,其中包含与单个数字整数集合相交的所有字符(' [0-9]')以及包含整数3,4和的该集合的子集5(' [345]')。

这适用于大多数需求,但它要求在编译时知道这两个集合。让我们说我正在为数学表达式编写一个词法分析器,并希望找到一元运算符集和二元运算符之间的交集。目前,两个集合中唯一存在的运营商是' - '。作为二元运算符' - '表示减法,但作为一元运算符,它也表示否定。我预计其他运营商将来可能会被用于双重用途,并且希望开发一种解决方案,该解决方案不仅适用于本案例,而且适用于未来改变代码的情况。为此,我需要能够在运行时确定两个集合中存在哪些运算符。

假设我有两个字符类定义如下:

public static final String UNARYOPS = "[!~-]";
public static final String BINARYOPS = "[|&%^*/+-]";

如何使用Java中的正则表达式引擎找到这两个命名字符集之间的交集,以便我可以确定哪些运算符需要检查二进制和一元之间的歧义?

1 个答案:

答案 0 :(得分:1)

这两个单表达式没有内置的正则表达式运算符。你必须自己硬编码。

旁注:您的正则表达式包含" - "在具有特殊含义且必须转义的字符类中:

public static final String UNARYOPS = "[!~\\-]";
public static final String BINARYOPS = "[|&%^*/+\\-]";

现在要么在字符串级别执行:

String regex = UNARYOPS.substring(0, UNARYOPS.length() - 1) + "&&" + BINARYOPS + "]";

或者您将字符类的所有字符都放入一个集合中。然后交叉这些集合。