2016-05-04 18 views
1

私はUML2ジェネレータを使用してmodel.xmlからUMLファイルを生成しました。Javaは文字列内の複数の部分文字列を正規表現で置き換えます

ここでは、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でパターンを見つけて置き換えようとします。 1つの問題は、ジェネレートされた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)); 

あなたは正しい方向に私を少しでも向けることができます。私の脳は今は少しぼやけている。

+2

質問には希望の出力を含める必要があります。 –

+1

if(matcher.find())をwhile(matcher.find())に変更する – markbernard

+1

if(m.find())の中で 'content = content.replaceAll(replaceString、" ");'を実行すると、 ' – markbernard

答えて

0

私は変更マークを記載し、それが私が望むように動作します。

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)); 

私はちょうどでReplaceAllを(ながら移動する)(matcher.find場合、外側を変更しなければならなかった)第二m.find内部()。

私はTim Biegeleisenのソリューションを試していません。

3

は、私はあなたがreplaceAll()に1回の呼び出しで逃げることができると信じて:

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プロパティを空にしようとしていたことを前提としていあなたの質問が示唆しているようなものです。

+0

希望の結果を追加しないと申し訳ありません。ご回答有難うございます。 –

関連する問題