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
的交集是否为空(如果存在一些常见匹配项)。