如何使用正则表达式用预定义的字符串替换XML元素的中间部分?

时间:2014-01-08 21:55:39

标签: java xml regex

我需要传输一个XML字符串,将密码元素转换为包含第一个和最后一个字符的字符串,其余部分应由x填充。元素字符串的长度应保持不变。例如,

<UserPassword>Douve</UserPassword> 

应转换为

<UserPassword>Dxxxe</UserPassword>.  

我使用Java编程但想避免使用XML解析,只需使用正则表达式。有可能吗?

3 个答案:

答案 0 :(得分:3)

您可以使用此模式:

(?:(?<=<UserPassword>.)|\\G(?<!^)).(?=[^<]+</UserPassword>)

这个替代品:

x

使用replaceAll方法。

示例:

String pattern = "(?:(?<=<UserPassword>.)|\\G(?<!^)).(?=[^<]+</UserPassword>)";
yourstr = yourstr.replaceAll(pattern, "x");

模式细节:

(?:                       # open a non capturing group
    (?<=<UserPassword>.)  # lookbehind: preceded by <UserPassword> and a character
  |                       # OR
    \\G(?<!^)             # contiguous to a precedent match but not at the start of the string
)                         # close the non capturing group
.                         # a character
(?=                       # lookahead: followed by 
    [^<]+                 #  at least one character (that is not a <)
    </UserPassword>       #  and </UserPassword>
)                         # close the lookahead assertion

注意:

如果 UserPassword 标记可以包含属性,则可以在模式中将<UserPassword>更改为<UserPassword\b[^>]{0,1000}>。在Java中,允许有限的可变长度lookbehinds。

我在此假设密码不包含换行符或<

答案 1 :(得分:1)

尝试使用正则表达式(?<=<UserPassword>.)\w*?(?=.</UserPassword>)来查找密码。外观和前瞻不算数。然后使用匹配的大小并将匹配替换为匹配大小的x。有关文档,请参阅Matcher

您无法使用replaceAll,因为在匹配到达之前,所需的x数是未知的。如果总是3 x,则可以在replaceAll中使用左侧的整个模式,并替换为xxx

答案 2 :(得分:0)

Pattern p = Pattern.compile("(<UserPassword>\\w)(\\w*)(\\w</UserPassword>)");
String input = "<UserPassword>Douve</UserPassword> ";
Matcher m = p.matcher(input);
if (m.find()) {
  System.out.println(m.replaceFirst("$1xxx$3"));
}

关键是Matcher.replaceFirst。在输出中保留第一组和第三组,而第二组替换为'xxx'。