通过与Java中的正则表达式匹配来替换字符串

时间:2011-11-11 22:10:39

标签: java regex

此处monitorUrl包含 - http://host:8810/solr/admin/stats.jsp
和monitorUrl有时可以是 - http://host:8810/solr/admin/monitor.jsp

所以我想将stats.jsp和monitor.jsp替换为ping

if(monitorUrl.contains("stats.jsp") || monitorUrl.contains("monitor.jsp")) {
                trimUrl = monitorUrl.replace("[stats|monitor].jsp", "ping");
            }

上述代码有任何问题。因为我在trimUrl中获得了相同的monitorUrl值。

3 个答案:

答案 0 :(得分:4)

尝试使用replaceAll而不是替换(并按照Alan指出的那样逃避点):

trimUrl = monitorUrl.replaceAll("(stats|monitor)\\.jsp", "ping");

来自文档:

  

<强> replaceAll

public String replaceAll(String regex, String replacement)
     

将此字符串中与给定正则表达式匹配的每个子字符串替换为给定的替换。


注意:您可能还需要考虑仅在/后进行匹配,并在正则表达式末尾使用$检查它是否在行尾。

答案 1 :(得分:3)

我认为这就是你要找的东西:

trimUrl = monitorUrl.replaceAll("(?:stats|monitor)\\.jsp", "ping");

说明:

  1. replaceAll()将第一个参数视为正则表达式,而replace()将其视为文字字符串。

  2. 您使用括号而不是方括号来分组。 (?:...)非捕获组的形式;你应该使用捕捉形式 - (...) - 只有当你真的需要捕捉某些东西时。

  3. .是元字符,因此如果要匹配文字点,则需要将其转义。

  4. 最后,您不必分别检查是否存在哨兵字符串;如果它不存在,replaceAll()只返回原始字符串。就此而言,replace()也是如此;你也可以这样做:

    trimUrl = monitorUrl.replace("stats.jsp", "ping")
                        .replace("monitor.jsp", "ping");
    

答案 2 :(得分:1)

无需使用正则表达式(同时replace()也不要使用正则表达式)。

trimUrl = monitorUrl.replace("stats.jsp", "ping").replace("monitor.jsp", "ping");