簡體   English   中英

Java用正則表達式替換字符串中的多個子串

[英]Java replace multiple substrings within a string with 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屬性,這正是您的問題所暗示的。

我做了改變markbernard提到它,它按我想要的方式工作。

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);
while (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(replaceString, "");
  }
}

Files.write(path, content.getBytes(charset));

我只需要將外部if matcher.find()更改為while,並將replaceAll()移動到第二個m.find()中。

我還沒有嘗試過Tim Biegeleisen解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM