有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

当我试着用一个通用的术语来代替卫生棉条时

规则:

  1. 我想将“AM”替换为“AN”,将“EM”替换为“AN”,将“IM”替换为“IN”,将“OM”替换为“ON”,将“UM”替换为“UN”,将“YM”替换为“IN”
  2. 我还想仅当辅音在它们后面时替换它们,除了“M”和“N”
  3. 我也只需要在它们单独存在或处于字符串末尾时替换case

我尝试了一些正则表达式,但仍然有一些失败的测试(5/18)

有“umumum”的faillure测试期望“umumum”,但我有“UMUMMUM”

这是我现在的代码:

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) 个答案

  1. # 1 楼答案

    如果YM替换为YN not 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();
        }
    }