繁体   English   中英

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

[英]Regex replacing specific characters in java

当我放置一个通用术语(此处称为棉塞)时,我试图替换某些情况。

规则:

  1. 我想将“ AM替换为“ AN”,“ EM”替换为“ AN”,IM”替换为“ ON”,“ OM”替换为“ ON”,“ UM”替换为“ UN”,将“ YM”替换为“ IN”。
  2. 我也只想在“ M”和“ N”以外的辅音之后替换它们。
  3. 当它们单独出现或在字符串末尾时,我也只需要替换大小写。

我已经尝试过一些正则表达式,但是在测试中仍然遇到一些失败(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;
    }
}

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

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

由于从YM到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();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM