正则表达式替换java中的特定字符

时间:2015-04-02 09:28:11

标签: java regex

当我提出一个通用术语(这里称为卫生棉条)时,我正在尝试更换一些案例。

规则:

  1. 我想将“AM”替换为“AN”,“EM”改为“AN”,“IM”改为“IN”,“OM”改为“ON”,“UM”改为“UN”和“YM”改为“在”。
  2. 除了“M”和“N”之外,我还想在辅音后面替换它们。
  3. 我需要在单独或在字符串末尾时仅更换外壳。
  4. 我尝试了一些正则表达式,但仍然在我的测试中遇到了一些失败(5/18)。

    对于“UMUMMUM”来说,测试需要“UMUMMUM”,但我有“UMUMMUN”。

    现在是我的代码:

    public class Phonom {
        static String[] consonnant={"B","C","D","F","G","H","J","K","L","P","Q","R","S","T","V","W","X","Z",""};
        public static String phonom1(final String tampon){
            if (tampon == null){
                return "";
            }
            if (tampon.isEmpty()){
                return "";
            }
    
    
            int pos=tampon.indexOf("EM");
            int pos1=tampon.indexOf("AM");
            int pos2=tampon.indexOf("IM");
            int pos3=tampon.indexOf("OM");
            int pos4=tampon.indexOf("UM");
            int pos5=tampon.indexOf("YM");
            if(pos==tampon.length()-2 ||pos1==tampon.length()-2|pos2==tampon.length()-2
                    ||pos3==tampon.length()-2||pos4==tampon.length()-2||pos5==tampon.length()-2){
                String temp=tampon.replaceAll("AM","AN");
                String temp1=temp.replaceAll("EM","AN");
                String temp2=temp1.replaceAll("IM","IN");
                String temp3=temp2.replaceAll("OM","ON");
                String temp4=temp3.replaceAll("UM","UN");
                String result=temp4.replaceAll("YM","IN");
                return result;
            }
            String temp=tampon.replaceAll("AM[^AEIOUMNY]","AN");
            String temp1=temp.replaceAll("EM[^AEIOUMNY]","AN");
            String temp2=temp1.replaceAll("IM[^AEIOUMNY]","IN");
            String temp3=temp2.replaceAll("OM[^AEIOUMNY]","ON");
            String temp4=temp3.replaceAll("UM[^AEIOUMNY]","UN");
            String result=temp4.replaceAll("YM[^AEIOUMNY]","IN");
            return result;
        }
    }
    

1 个答案:

答案 0 :(得分:0)

如果YM被YN替换为IN,则可以在一行中完成此操作。

  

tampon.replaceAll("(?< = [AEIOUY])(M)(?![AEIOUYMN])"," N");

由于YM to IN规则,您需要使用appendReplacement和appendTail。下面的代码使用负向前看以确保可能的替换后面没有元音,M或N.如果第一组是Y,我们用IN替换匹配。如果不是,我们使用对组1中的角色的反向引用,并用N来跟随它。

public class Phonom {
    private static final Pattern PATTERN = Pattern.compile("([AEIOUY])(M)(?![AEIOUYMN])");

    public static String phonom1(String tampon) {

        Matcher m = PATTERN.matcher(tampon);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            if ("Y".equals(m.group(1))) {
                m.appendReplacement(sb, "IN");
            } else {
                m.appendReplacement(sb, "\1N");
            }
        }
        m.appendTail(sb);
        return sb.toString();
    }
}