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

How to substring and get previous character

我对 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">.

试试这个代码:

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.

单元测试输出有点混乱(可能应该颠倒比较顺序以使消息合理)。但基本上,它说的是你 returning null 而不是 returning CYR.Y.E.

你正在 returning null 因为这条线:

            return phaille2.get(tampon);

你的tampon就是原来的字符串CYRILLEphaille2 中没有与键 CYRILLE 匹配的项目(只有 ILL 的项目),因此 HashMap returns null,这就是你 return.

你正在做的是:

  • 正在寻找ILL的位置(很好)。
  • 从那个位置forward找到tabmpon的子串(为什么?这会给你ILLE)。
  • 正在检查它是否以 C 开头(不会,因为它总是以 ILL 开头,因为那是您正在搜索的内容)。
  • 返回基于 tampon 的密钥,我已经告诉过你,哈希 table.
  • 中不存在该密钥

你应该做什么:

  • 像你一样找到 ILL 的位置。
  • 如果位置为 0,将 ILL 替换为 HashTable 包含的 "ILL" 的内容(不是 tampon).

    • 你应该从你找到的 ILL 的位置之前取出 tampon 的子串,
    • 然后添加您从 HashTable
    • 中获得的替代品
    • 然后在ILL.
    • 之后添加tampon的子串

    您可能需要稍微尝试一下才能得到正确的数字。

  • 如果位置为-1,则数字中没有ILL,需要原样returntampon
  • 如果位置为正,请查看 tampon.charAt(position-1) 中的内容,然后决定是否需要替换 ILL(如上所述)。

我建议 against 使用正则表达式,因为我不认为你的 class 在这一点上有人教过它,从你的问题看来你应该用 substring.

来解决这个问题