Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/338.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 比较2个正则表达式字符串_Java_Regex_Match - Fatal编程技术网

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

Java 比较2个正则表达式字符串,java,regex,match,Java,Regex,Match,我正在编写一个迁移实用程序,其中一个转换的一部分是测试一对正则表达式。例如,一些测试将是: +-------+-------+-------+ | Left | Right | Match | +-------+-------+-------+ | (.)01 | 101 | Yes | +-------+-------+-------+ | (.)02 | 101 | No | +-------+-------+-------+ | 101 | 101 | Yes

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

+-------+-------+-------+
| Left  | Right | Match |
+-------+-------+-------+
| (.)01 | 101   | Yes   |
+-------+-------+-------+
| (.)02 | 101   | No    |
+-------+-------+-------+
| 101   | 101   | Yes   |
+-------+-------+-------+
| 201   | (.)01 | Yes   |
+-------+-------+-------+
| (.)01 | 2(.)1 | Yes   |
+-------+-------+-------+
目前,我的测试使用
.matches
逐个进行测试,这在只有一个边是正则表达式时有效,但当两边都有一个正则表达式(即示例的最后一行)时,它会在应该返回true时返回false


那么,如何才能为最后一个示例获得肯定的比较结果呢?

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

从两个字符串中删除基于通配符的字符,然后使用
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");
    }

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

正则表达式表示一组可能的匹配项:
(.01
匹配
a01
301
$01

因此,当您将该集合中的一个项目(例如,
$01
)与正则表达式匹配时,这样做是有意义的

在上一个例子中,您试图将正则表达式与正则表达式匹配,这很愚蠢。哪个正则表达式是源,哪个字符串是目标?如果第一个正则表达式是您的源代码,
201
与之匹配,但也与
101
01
等匹配。。。但根据第二个正则表达式,这是不对的,它匹配像
201
,但也匹配
2#1
291
这样的项。因此,它们不应被视为“相互匹配”

看看这个维恩图:

你上一次的正则表达式比赛中有两个正则表达式互相争斗。 第一个正则表达式由圆圈A表示。第二个正则表达式由圆圈B表示

有一些元素(只是
201
)同时位于A圈和B圈中(由A和B圈中颜色较深的
指出)。你认为这些圆圈是匹配的吗?我当然不知道。如果他们互相掩护,我会的

但是,这些圈相互覆盖的唯一方法(意味着A圈中的所有内容都在B圈中,B圈中的所有内容都在A圈中)是如果两个正则表达式完全相同!比如,
(.01
和<代码>(.)01
!这是唯一可能的匹配,但如果您将一个视为正则表达式,另一个视为字符串,它仍然不起作用


编辑如果您只想确定这是否至少是一个常见匹配,这可能会很有帮助:

为什么最后一个返回
的字符应该是
,因为
的第一个字符是野生的,右边
的第二个字符是Wild,但最后一个字符不匹配现在有道理:)为什么
(.01
会匹配
2(.1
?例如
(.)01
匹配
901
2(.)1
匹配
281
,但是
901
281
非常不同。请更详细地解释您试图实现的目标以及您迄今为止的尝试。如果双方都有
(.*)
?我本可以编写完整的实现,但我故意将其留给OP来实现。此解决方案不正确。如果str1是
1(*)1
而str2是
1(*)1
,则第一个If块将把它们修改为str1=
11
str2=
1*)1
。第二个if语句不起作用,最后一个if语句得出结论,它们是不相等的。如果任一字符串中有多个
(.)
,也会出现错误。或者如果str1=
(.)11
str2=
111
作为str2.replace将用空字符串替换str2中的所有字符串。@Alderath我同意你的看法。我已经说过,这不是一个全面的实施。这可能是实现OP所需功能的一种方法。OP不想检查
a
=
B
,而是检查
a
B
的交集是否为空(如果存在一些常见匹配项)。