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

How do you perform an intersection of two named regex character classes in Java?

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

示例:

 [0-9&&[345]]

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

这可以很好地满足大多数需求,但它需要在编译时知道这两个集合。假设我正在为数学表达式编写词法分析器,并希望找到一元运算符和二元运算符集之间的交集。目前,唯一存在于这两个集合中的运算符是“-”。作为二元运算符“-”表示减法,但作为一元运算符它也表示否定。我预计将来其他运营商可能会被迫双重使用,并希望开发一种既适用于当前情况,又适用于未来情况的解决方案,而无需更改代码。为此,我需要能够在 运行 时确定两组中存在哪些运算符。

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

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

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

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

旁注:您的正则表达式在字符 class 中包含一个“-”,它具有特殊含义,必须转义:

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

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

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

或者你把字符classes的所有字符放到一个集合中,每个。然后将这些集合相交。