2014-04-11 33 views
1

之间更换子,我有以下XML片段作为一个字符串:爪哇 - 找到两个模式字符串

String str ="<xs:user>userName</xs:user><xs:password>userPassword</xs:password> 
<xs:address>addressString</xs:address>"; 

什么是与XXXXXXX更换的userPassword的最好方法?

编辑:xs(namespace)可以变化。

+1

边界/特例:如果密码包含<? –

回答

1

尝试使用这样的:

String str2 = str.replaceFirst("<xs:password>.*?</xs:password>", "<xs:password>xxxxxxxxxx</xs:password>");` 
+0

我不会在这里使用贪婪的'。*',而是用'。*?'替换它。 – Joffrey

+0

是的,这是很好的建议..编辑.. – anirudh

1

这应该这样做。这是我现在可以想到的最简单的解决方案。

public static void main(String[] args) { 
    String str = "aaaaa<xs:password>userPassword</xs:password>bbbbbbbbbb"; 
    String newPassword = "test"; 
    String s2 = str.replaceAll("<xs:password>[^<]*</xs:password>", "<xs:password>" + newPassword + "</xs:password>"); 
    System.out.println(s2); 
} 
+0

我宁愿@anirudh版本,因为你的排除嵌套标签,所以不能一般化,即使它在这里做这项工作。 – Joffrey

+0

+1对于工作解决方案,虽然。 – Joffrey

0

的老校友爬网直通串计算策略是:

String in = 
      "<xs:user>userName</xs:user>" + 
      "<xs:password>userPassword</xs:password>" + 
      "<xs:address>addressString</xs:address>"; 

    int pwStart = in.indexOf("<xs:password>") + 13; 
    int pwLen = in.indexOf("</xs:password>") - pwStart; 

    StringBuilder out = new StringBuilder(); 

    out.append(in.substring(0, in.indexOf("<xs:password>") + 13)); 
    for (int i = 0; i < pwLen; i++) { 
     out.append("x"); 
    } 
    out.append(in.substring(in.indexOf("</xs:password>"))); 

    System.out.printf("%s\n", in); 
    System.out.printf("%s\n", out); 
0

在Java:

public static void replace(){ 

    String str = 
      "<xs:user>userName</xs:user>" + 
      "<xs:password>userPassword</xs:password>" + 
      "<xs:address>addressString</xs:address>"; 

    String[] s = str.split("><"); 

    String[] t = s[1].split("password>"); 

    String[] a = t[1].split("</xs:"); 

    System.out.println(a[0]); 

    String newS = s[0] + "><" + t[0] + "password>" + "YOUR XXXXXXX GOES HERE" + "</xs:" + a[1] + "><" + s[2]; 

    System.out.println(newS); 

} 

希望这有助于。