如何用Java中的XML字符串中的模式替换所有域?

时间:2018-02-02 16:31:56

标签: java regex xml parsing url

我有这样的XML输出(< xml>元素或xlink:href属性只是虚构的,你不能依赖它们来创建正则表达式。

{{ testTableTburnsList | json }}

我想要做的是使用Java正则表达式替换域模式(我不知道现有域名):

TestTableTburnsApiService

带有输入域(例如:http://google.com/def),结果为:

<xml>http://localhost:8080/def/abc/xyx</xml>
<element xlink:href="http://localhostABCDEF/def/ABC/XYZ">Some Text</element>
...

我该怎么办?我认为Java中的Regex可以做或者String.replaceAll(但这个似乎不可能)。

2 个答案:

答案 0 :(得分:0)

正则表达式http[s]?:\/{2}.+\/def 替换http://google.com/def

<强>详情:

  • ?匹配0到1次
  • []匹配列表中的单个字符
  • .匹配任何字符
  • +匹配一次且无限次

Java代码

String domain = "http://google.com/def";
String html = "<xml>http://localhost:8080/def/abc/xyx</xml>\r\n<element xlink:href=\"http://localhostABCDEF/def/ABC/XYZ\">Some Text</element>";

html = html.replaceAll("http[s]?:\\/{2}.+\\/def", domain);
System.out.print(html);

<强>输出

<xml>http://google.com/def/abc/xyx</xml>
<element xlink:href="http://google.com/def/ABC/XYZ">Some Text</element>

答案 1 :(得分:0)

实际上,这可以使用Regex来完成,它比解析XML文档简单得多。这是答案:

String text = "<epsg:CommonMetaData>\n"
            + "      <epsg:type>geographic 2D</epsg:type>\n"
            + "      <epsg:informationSource>EPSG. See 3D CRS for original information source.</epsg:informationSource>\n"
            + "      <epsg:revisionDate>2007-08-27</epsg:revisionDate>\n"
            + "      <epsg:changes>\n"
            + "        <epsg:changeID xlink:href=\"http://www.opengis.net/def/change-request/EPSG/0/2002.151\"/>\n"
            + "        <epsg:changeID xlink:href=\"http://www.opengis.net/def/change-request/EPSG/0/2003.370\"/>\n"
            + "        <epsg:changeID xlink:href=\"http://www.opengis.net/def/change-request/EPSG/0/2006.810\"/>\n"
            + "        <epsg:changeID xlink:href=\"http://www.opengis.net/def/change-request/EPSG/0/2007.079\"/>\n"
            + "      </epsg:changes>\n"
            + "      <epsg:show>true</epsg:show>\n"
            + "      <epsg:isDeprecated>false</epsg:isDeprecated>\n"
            + "    </epsg:CommonMetaData>\n"
            + "  </gml:metaDataProperty>\n"
            + "  <gml:metaDataProperty>\n"
            + "    <epsg:CRSMetaData>\n"
            + "      <epsg:projectionConversion xlink:href=\"http://www.opengis.net/def/coordinateOperation/EPSG/0/15593\"/>\n"
            + "      <epsg:sourceGeographicCRS xlink:href=\"http://www.opengis.net/def/crs/EPSG/0/4979\"/>\n"
            + "    </epsg:CRSMetaData>\n"
            + "  </gml:metaDataProperty>"
            + "<gml:identifier codeSpace=\"OGP\">http://www.opengis.net/def/area/EPSG/0/1262</gml:identifier>";

    String patternString1 = "(http(s)?://.*/def/.*)";

    Pattern pattern = Pattern.compile(patternString1);
    Matcher matcher = pattern.matcher(text);

    String prefixDomain = "http://localhost:8080/def";

    StringBuffer sb = new StringBuffer();

    while (matcher.find()) {
        String url = prefixDomain + matcher.group(1).split("def")[1];
        matcher.appendReplacement(sb, url);
        System.out.println(url);
    }
    matcher.appendTail(sb);
    System.out.println(sb.toString());

返回输出https://www.diffchecker.com/CyJ8fY8p