Java用正则表达式替换字符串中的多个子字符串

标签 java regex

我已经使用 UML2 生成器从 model.xml 生成了一个 UML 文件。

现在我想替换在 xmi:id="generated id"中创建的生成的 id。

下面是生成的 UML 代码片段。

<packagedElement xmi:type="uml:Package" xmi:id="_lAAK0A34Eeap1Y_jd5mZDA" name="java">
  <packagedElement xmi:type="uml:Package" xmi:id="_lAAK0Q34Eeap1Y_jd5mZDA" name="lang">
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK0g34Eeap1Y_jd5mZDA" name="String"/>
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK0w34Eeap1Y_jd5mZDA" name="Boolean"/>
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK1A34Eeap1Y_jd5mZDA" name="Byte"/>
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK1Q34Eeap1Y_jd5mZDA" name="Character"/>
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK1g34Eeap1Y_jd5mZDA" name="Double"/>
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK1w34Eeap1Y_jd5mZDA" name="Float"/>
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK2A34Eeap1Y_jd5mZDA" name="Integer"/>
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK2Q34Eeap1Y_jd5mZDA" name="Long"/>
    <packagedElement xmi:type="uml:DataType" xmi:id="_lAAK2g34Eeap1Y_jd5mZDA" name="Short"/>
  </packagedElement>
</packagedElement>

我曾尝试使用正则表达式删除 ID。首先,我读取文件并将其转换为字符串,然后使用 Matcher 找到一个模式并尝试替换它。一个问题是生成的 ID 相似但不相同,我不知道如何解决这个问题。我想这不起作用,因为它只需要第一个?

Path path = profileFile.toPath();
Charset charset = StandardCharsets.UTF_8;
String replaceString = "";
String content = new String(Files.readAllBytes(path), charset);
Pattern pattern = Pattern.compile("xmi:id=\"([A-Za-z0-9_]*)\"");
Matcher matcher = pattern.matcher(content);
if (matcher.find())
{
  replaceString = matcher.group(0);
  Pattern p = Pattern.compile("\"([^\"]*)\"");
  Matcher m = p.matcher(replaceString);
  if (m.find())
  {
    System.out.println("is this the real life:    " + m.group(1));
    replaceString = m.group(1);
  }
}
// content = content.replaceAll("xmi:id=\"([A-Za-z0-9_]*)\"", "xmi:id=\"\"");
content = content.replaceAll(replaceString, "");
Files.write(path, content.getBytes(charset));

任何想法都会受到赞赏,您可以将我推向正确的方向。我的大脑现在有点模糊。

最佳答案

我相信您只需调用一次 replaceAll() 即可:

String input = "<packagedElement xmi:type=\"uml:DataType\" xmi:id=\"_lAAK0g34Eeap1Y_jd5mZDA\" name=\"String\"/>";
String output = input.replaceAll("xmi:id=\".*?\"", "xmi:id=\"\"");
System.out.println("Input:\n" + input);
System.out.println("Output:\n" + output);

输出:

Input:
<packagedElement xmi:type="uml:DataType" xmi:id="_lAAK0g34Eeap1Y_jd5mZDA" name="String"/>
Output:
<packagedElement xmi:type="uml:DataType" xmi:id="" name="String"/>

这假设您正试图清空 XML 标记中的 xmi:id 属性,您的问题似乎暗示了这一点。

关于Java用正则表达式替换字符串中的多个子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37028299/

相关文章:

javascript - 使用来自已加载网页的 JavaScript 调用重新加载 WebView

java - 删除下载目录中的文件

java - SQLite 数据库间接调用 NullPointerException?

java - 转义字符类中的单个字符

javascript - 短语的正则表达式(不仅仅是单词)

java - XSL 替换字符串值中的两种类型的字符

java - 光线追踪三角形

java - Hibernate SaveOrUpdate - 多个工作线程

java - 用 File.separator 替换所有 "/"

swift - 小数字段的正则表达式问题 - Swift