我仍然是java的新手,我搜索用另一个字符串替换字符串的一部分,除非该字符串的前一个字符是C,V,M,G或W.如果我得到BILLE
作为输入,我希望输出给我B.Y.E
,但如果我输入MILLE
,我希望MILLE
作为输出。
这是我尝试过的:
import java.util.HashMap;
import java.util.Map;
public class Phaille {
static Map<String, String> phaille2 = new HashMap<String, String>();
static {
phaille2.put("ILL", ".Y.");
}
public static String phaille1(final String tampon){
int position= tampon.indexOf("ILL");
String sub=tampon.substring(position,tampon.length());
if (position != -1 ){
if(!(sub.endsWith("C"))){
return phaille2.get(tampon);
}
}
return tampon;
}
}
但是,当我使用"CYRILLE"
,"CECILLE"
,"ILL"
,"CILLILLILL"
进行测试时,测试会给我
org.junit.ComparisonFailure: expected:<null> but was:<"CYR.Y.E">.
答案 0 :(得分:3)
试试这段代码:
public static void main(String[] args) {
String s1 = "BILLE";
String s2 = "MILLE";
String pattern = "(?<![WCVMG])ILL";
System.out.println(s1.replaceAll(pattern, ".Y."));
System.out.println(s2.replaceAll(pattern, ".Y."));
System.out.println("CYRILLE".replaceAll(pattern, ".Y."));
System.out.println("CILLILLILL".replaceAll(pattern, ".Y."));
}
O / P:
B.Y.E
MILLE
CYR.Y.E
CILL.Y..Y.
答案 1 :(得分:0)
单元测试输出有点令人困惑(它可能会颠倒比较顺序以使消息合理)。但基本上,它说的是你返回null
而不是返回CYR.Y.E
。
由于此行,您将返回null
:
return phaille2.get(tampon);
您的tampon
是原始字符串CYRILLE
。 phaille2
中没有与关键CYRILLE
匹配的项目(ILL
只有一个项目),因此HashMap
会返回null
,这是你回来了什么。
你在做的是:
ILL
(好的)的位置。tabmpon
的子字符串转发(为什么?这会给你ILLE
)。C
开头(它不会,因为它始终以ILL
开头,因为这是您正在搜索的内容。)tampon
返回的密钥在哈希表中不存在。你应该做什么:
ILL
的位置。如果该排名为0,则将ILL
替换为HashTable
包含的"ILL"
(不 tampon
)。< / p>
tampon
的位置之前取ILL
的子字符串,HashTable
tampon
后从添加ILL
的子字符串。你可能需要稍微玩一下才能得到正确的数字。
ILL
,您需要按原样返回tampon
。tampon.charAt(position-1)
中的内容,并决定是否需要替换ILL
(如上所述)。我建议反对使用正则表达式,因为我不认为它是在你班级的这一点上教授的,而且从你的问题来看,你应该用你的问题解决这个问题。 substring
。