【问题标题】:Avoid leading numbers in xml element name避免 xml 元素名称中的前导数字
【发布时间】:2020-04-15 19:56:24
【问题描述】:

我想要一个 Java 方法来替换 xml 元素名称中的前导数字。例如<1396-tt5m>25K</1396-tt5m>需要转换为<a-tt5m>25K</a-tt5m>。请看一下我的方法:

public static String removeLeadNumbersFromXMLTagElements(String xml) throws TransformerException {

        Pattern p = Pattern.compile("(<[^>]*?[^[0-9]][^>]*?>)");
        Matcher m = p.matcher(xml);

        StringBuffer result = new StringBuffer();

        while (m.find()) {
            String replace = m.group().replaceAll("[^[0-9]]+", "a");            
            m.appendReplacement(result, replace);
        }

        m.appendTail(result);
        return result.toString();
    }

但是我的方法的结果是:&lt;a-ttam&gt;25K&lt;/a-ttam&gt;。你能帮助正确的正则表达式吗?提前谢谢你。

【问题讨论】:

    标签: java regex xml


    【解决方案1】:

    试试这个:

    public static String removeLeadNumbersFromXMLTagElements(String xml) throws TransformerException {
    
        Pattern p = Pattern.compile("(\\<.*?)[0-9]+(.*?\\>)");
        Matcher m = p.matcher(xml);
    
        StringBuffer result = new StringBuffer();
    
        while (m.find()) {
            String replace = m.group(1) + "a" + m.group(2);
            m.appendReplacement(result, replace);
        }
    
        m.appendTail(result);
        return result.toString();
    }
    

    【讨论】:

    • 这个解决方案和我的很相似,谢谢!最好的问候!
    【解决方案2】:

    所以这不是您想要的,但它应该可以解决问题。它将获取标签,然后删除任何前导数字,但仅此而已。此代码替换您的 while 循环。您的代码可以很好地识别标签,但是(正如您所指出的)它正在替换所有数字,而不仅仅是前导数字。

    while (m.find()) {
    //System.out.println(m.group());
    String work = m.group();
    String replace = m.group();
    if (work.substring(0, 2).equals("</")) {
        //System.out.println("end tag");
        if (work.length() > 2 && Character.isDigit(work.charAt(2))) {
            replace = "</a";
            int i = 3;
            while (i < work.length() && Character.isDigit(work.charAt(i))) {
                i++;
            }
            replace += work.substring(i);
        }
    } else if (work.substring(0, 1).equals("<")) {
        //System.out.println("begin tag");
        if (work.length() > 1 && Character.isDigit(work.charAt(1))) {
            replace = "<a";
            int i = 2;
            while (i < work.length() && Character.isDigit(work.charAt(i))) {
                i++;
            }
            replace += work.substring(i);
        }
    }
    m.appendReplacement(result, replace);
    }
    

    【讨论】:

    • 非常感谢!不错的解决方案!最好的问候
    【解决方案3】:

    我的解决方案:我终于找到了I can use String replace = m.group().replaceFirst("[^[0-9]]+", "a")而不是replaceAll。这也有效!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      相关资源
      最近更新 更多