【问题标题】:Using regex on XML, avoid greedy match在 XML 上使用正则表达式,避免贪婪匹配
【发布时间】:2012-05-06 14:05:41
【问题描述】:

看起来很简单的问题,但我会在这里提供任何帮助:

我需要将密码值(可以是任何值)交换为“****

原始字符串是从 xml 中重新提取的字符串

问题是我得到的只是输出行:

         <parameter><value>*****</value></parameter>

但我只需要替换密码值作为输出的整个字符串

提前谢谢你

        String originalString = "<parameter>" +
            "<name>password</name>"+
            "<value>my123pass</value>"+
            "</parameter>"+
            "<parameter>"+
            "<name>LoginAttempt</name>"+
            "<value>1</value>"+
            "</parameter>";
    System.out.println("originalString: "+originalString);                         
    Pattern pat = Pattern.compile("<name>password</name><value>.*</value>");
    Matcher mat = pat.matcher(originalString);

    System.out.println("NewString: ");
    System.out.print(mat.replaceFirst("<value>***</value>"));
    mat.reset();  

【问题讨论】:

  • 尝试使用正则表达式来处理 XML 通常只会让您流泪。话虽如此,您的问题是 .* 是贪婪的,因此它匹配所有内容,直到您的字符串中的 last &lt;/value&gt; 。这就是为什么尝试使用正则表达式通常是个坏主意的原因之一。
  • 所以在星号后面加一个问号:.*?,看看你是否满意。这会将贪婪变成不情愿的行为。
  • 您的标题具有误导性,因为它提到了换行符,并且您的问题没有涉及换行符。已编辑。
  • 因为它是一个类似 String 的 XML 尝试使用像 Jdom 这样的 dom 或 sax 解析器
  • 这只是正则表达式的语法。 .* 匹配贪心; .*? 匹配不贪心。你的问题就像在问“* 如何做出贪婪的行为?” - 这只是约定/语法。

标签: java regex newline replaceall


【解决方案1】:

如果我没记错的话,你想用 *'s 更改字符串中的密码。您可以直接使用 String 方法来做到这一点。只需获取起始值标记的最后一个索引并迭代直到到达“

int from = originalString.lastIndexOf("<name>password</name><value>");
bool endIteration = false;
for(i = from + 1 ; i < originalString.length() && !endIteration ; i ++) {
    if(originalString.toCharArray()[i] == '<')
        endIteration = true;
    else {
        originalString.toCharArray()[i] = '*';
    }
}

编辑:还有另一种正确使用 String 类好东西的方法:

int from = originalString.lastIndexOf("<name>password</name><value>");
int to = originalString.indexOf("</value>", from);
Arrays.fill(originalString.toCharArray(), from, to, '*');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-04
    • 2017-04-29
    • 1970-01-01
    • 2017-12-04
    相关资源
    最近更新 更多