我需要传输一个XML字符串,将密码元素转换为包含第一个和最后一个字符的字符串,其余部分应由x填充。元素字符串的长度应保持不变。例如,
<UserPassword>Douve</UserPassword>
应转换为
<UserPassword>Dxxxe</UserPassword>.
我使用Java编程但想避免使用XML解析,只需使用正则表达式。有可能吗?
答案 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'。