如何子串并获取前一个字符

时间:2015-02-26 10:09:03

标签: java substring

我仍然是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">.

2 个答案:

答案 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是原始字符串CYRILLEphaille2中没有与关键CYRILLE匹配的项目(ILL只有一个项目),因此HashMap会返回null,这是你回来了什么。

你在做的是:

  • 寻找ILL(好的)的位置。
  • 从该位置找到tabmpon的子字符串转发(为什么?这会给你ILLE)。
  • 检查它是否以C开头(它不会,因为它始终以ILL开头,因为这是您正在搜索的内容。)
  • 根据我已经告诉过你的tampon返回的密钥在哈希表中不存在。

你应该做什么:

  • 找到ILL的位置。
  • 如果该排名为0,则将ILL替换为HashTable包含的"ILL" tampon)。< / p>

    • 您应该从tampon的位置之前取ILL的子字符串,
    • 然后添加您从HashTable
    • 获得的替换
    • 然后在 tampon后从添加ILL的子字符串。

    你可能需要稍微玩一下才能得到正确的数字。

  • 如果位置为-1,则数字中没有ILL,您需要按原样返回tampon
  • 如果排名是肯定的,请查看tampon.charAt(position-1)中的内容,并决定是否需要替换ILL(如上所述)。

我建议反对使用正则表达式,因为我不认为它是在你班级的这一点上教授的,而且从你的问题来看,你应该用你的问题解决这个问题。 substring