比较2个正则表达式字符串

时间:2014-07-01 11:52:43

标签: java regex match

我正在编写一个迁移实用程序,其中一个转换的一部分是测试一对正则表达式。例如,一些测试将是:

+-------+-------+-------+
| Left  | Right | Match |
+-------+-------+-------+
| (.)01 | 101   | Yes   |
+-------+-------+-------+
| (.)02 | 101   | No    |
+-------+-------+-------+
| 101   | 101   | Yes   |
+-------+-------+-------+
| 201   | (.)01 | Yes   |
+-------+-------+-------+
| (.)01 | 2(.)1 | Yes   |
+-------+-------+-------+

目前,我的测试使用.matches逐个测试,当只有一侧是正则表达式时可以正常工作,但是当双方都有一个时(即示例的最后一行),当它应该返回true时返回false。

那么,我怎样才能得到最后一个例子的正比较结果?

2 个答案:

答案 0 :(得分:2)

您正在使用正则表达式错误。您应该使用正则表达式将字符串与给定的正则表达式匹配,而不是相互测试正则表达式。

正则表达式代表一组可能的匹配:(.)01匹配a01301$01等等......

所以,当你匹配那个集合中的一个项目时,这样做是有意义的,例如。$01回到正则表达式。

在你的最后一种情况下,你试图将正则表达式与正则表达式进行匹配,这很愚蠢。哪个正则表达式是您的源,哪个String是您的目标?如果第一个正则表达式是您的来源,201匹配它,还有101#01等......但根据第二个正则表达式,这是不正确的,它匹配像{ {1}},还有2012#1。所以他们不应该被认为是相互匹配的。

看看这个维恩图:

enter image description here

你的最后一次正则表达比赛有两个正则数据集互相争斗。 第一个正则表达式由圆圈A表示。第二个正则表达式由圆圈B表示。

有些元素(嗯,只是291),它们都在圆圈A和圆圈B中(由深色201指出)。你会认为这些圈子是匹配的吗?我当然不会。如果他们完全相互覆盖,我会的。

但是这些圆圈完全相互覆盖的唯一方法(意思是圆圈A中的所有东西都在圆圈B中,圆圈B中的所有东西都在圆圈A中),如果两个正则表达式完全相同的话!就像both A & B和...... (.)01一样!这是唯一可能的匹配,但是如果你像处理一个正则表达式和一个像字符串一样处理它,它仍然无法工作。

编辑如果您只想查找这是否至少是一个常见匹配,这可能会有所帮助:https://stackoverflow.com/a/17957180/1283166

答案 1 :(得分:0)

在这种情况下,您不需要任何正则表达式比较。一个简单的算法将起作用。

从两个字符串中删除基于通配符的字符,然后使用equals()方法进行检查。

如果每个字符串中只出现一次通配符,这样的内容可能对您有所帮助:

    final String WILD_CARD = "(.)";
    String str1 ="(.)01";
    String str2 ="2(.)1";
    int index = -1;
    if((index=str1.indexOf(WILD_CARD))!=-1) {
        str1 = str1.replace(WILD_CARD, "");
        str2 = str2.replace(String.valueOf(str2.charAt(index)),"");
    }

    if((index=str2.indexOf(WILD_CARD))!=-1) {
        str2 = str2.replace(WILD_CARD, "");
        str1 = str1.replace(String.valueOf(str1.charAt(index)), "");
    } 

    if(str1.equals(str2)) {
        System.out.println("Yes");
    } else {
        System.out.println("No");
    }