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

通过与Java中的正则表达式匹配来替换字符串,java,regex,Java,Regex,此处监视器URL包含-http://host:8810/solr/admin/stats.jsp 监视器URL有时可以是--http://host:8810/solr/admin/monitor.jsp 因此,我想将stats.jsp和monitor.jsp替换为ping if(monitorUrl.contains("stats.jsp") || monitorUrl.contains("monitor.jsp")) { trimUrl = monitorUrl

此处监视器URL包含-
http://host:8810/solr/admin/stats.jsp

监视器URL有时可以是--
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值时。

尝试使用而不是替换(并如Alan所指出的那样跳过圆点):

从文件中:

replaceAll

public String replaceAll(String regex, String replacement)
将此字符串中与给定正则表达式匹配的每个子字符串替换为给定替换


注释:您也可以只考虑在<代码> /<代码>之后匹配,并在正则表达式结束时使用<代码> $>代码>检查它的结尾。

不需要使用正则表达式(也<代码>替换)(<代码> >不要使用正则表达式)。
我想这就是你想要的:

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

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

  • 你用括号而不是方括号来分组
    (?:…)
    是组的非捕获形式;只有在确实需要捕获某些内容时,才应使用捕获表单-
    (…)

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

  • 最后,您不必单独检查哨兵字符串的存在;如果它不在那里,
    replaceAll()
    只返回原始字符串。就这点而言,
    replace()
    ;您也可以这样做:

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

    如果您这样做,
    “monitor.jsstats.jsp”
    将变成
    “ping”
    。感谢您的详细解释。如何从最后一个
    /
    开始到字符串末尾进行匹配。我对正则表达式非常陌生。
    “/(stats | monitor).jsp$”
    ”(?@Raihan Jamal:你说的“将不起作用”是什么意思?你可以用“/ping”代替“ping”。这对你不起作用吗?+1用于转义点,但最后一行与Zernike的答案有相同的问题:
    “monitor.jsstats.jsp”“
    将变成
    “ping”
    。没错,但根据问题,最后一段只能是
    monitor.jsp
    stats.jsp
    。无论如何,我就是这样读的。
    trimUrl = monitorUrl.replaceAll("(?:stats|monitor)\\.jsp", "ping");
    
    trimUrl = monitorUrl.replace("stats.jsp", "ping")
                        .replace("monitor.jsp", "ping");