我正在编写一个迁移实用程序,其中一个转换的一部分是测试一对正则表达式。例如,一些测试将是:
+-------+-------+-------+
| Left | Right | Match |
+-------+-------+-------+
| (.)01 | 101 | Yes |
+-------+-------+-------+
| (.)02 | 101 | No |
+-------+-------+-------+
| 101 | 101 | Yes |
+-------+-------+-------+
| 201 | (.)01 | Yes |
+-------+-------+-------+
| (.)01 | 2(.)1 | Yes |
+-------+-------+-------+
目前,我的测试使用.matches
逐个测试,当只有一侧是正则表达式时可以正常工作,但是当双方都有一个时(即示例的最后一行),当它应该返回true时返回false。
那么,我怎样才能得到最后一个例子的正比较结果?
答案 0 :(得分:2)
您正在使用正则表达式错误。您应该使用正则表达式将字符串与给定的正则表达式匹配,而不是相互测试正则表达式。
正则表达式代表一组可能的匹配:(.)01
匹配a01
,301
,$01
等等......
所以,当你匹配那个集合中的一个项目时,这样做是有意义的,例如。$01
回到正则表达式。
在你的最后一种情况下,你试图将正则表达式与正则表达式进行匹配,这很愚蠢。哪个正则表达式是您的源,哪个String是您的目标?如果第一个正则表达式是您的来源,201
匹配它,还有101
,#01
等......但根据第二个正则表达式,这是不正确的,它匹配像{ {1}},还有201
和2#1
。所以他们不应该被认为是相互匹配的。
看看这个维恩图:
你的最后一次正则表达比赛有两个正则数据集互相争斗。 第一个正则表达式由圆圈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");
}