首页 > 解决方案 > Java replaceAll 将“null”放入结果中

问题描述

我有一个正则表达式:

((((first_url)|(second_url)|(third_url))+\.dom\.local)?|.*)[^.]

这应该检查我的 baseURL 是否是本地的。

如果我在正则表达式测试器站点(如正则表达式 101)中运行它,我会得到正确的结果,我的意思是如果我用“$2”替换,如果字符串中没有我的本地 baseURL 之一,我不会得到任何结果。

但是在Java中我得到:

String t1 = "first_url.dom.local/service/myService".replaceAll(Constants.REGEX_CHECK_GET_URL_LOCAL, "$2").replaceAll("null", "");
String tt1 = "first_url.dom.local/service/myService".replaceAll(Constants.REGEX_CHECK_GET_URL_LOCAL, "$2");
String t2 = "another_url.dom.local/service/myService".replaceAll(Constants.REGEX_CHECK_GET_URL_LOCAL, "$2").replaceAll("null", "");
String tt2 = "another_url.dom.local/service/myService".replaceAll(Constants.REGEX_CHECK_GET_URL_LOCAL, "$2");

在哪里:

t1 = "first_url.dom.local"
tt1 = "first_url.dom.localnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnullnull"
t2 = ""
tt2 = "nullnullnullnullnullnullnullnullnullnullnullnull"

为什么“replaceAll”将所有这些“null”放在字符串中?我通过再次替换“nulls”来解决,但我个人认为这是解决这个问题的不好方法。另外,如果我尝试在线“replaceAll”,我会得到没有“null”字符串的正确结果:/

使用“模式”和“匹配器”变量不会改变结果。

另一个例子:我有一个对象属性,它是头像的 url。此属性可以具有用于下载 avar 的 BaseURL,也可以具有不带 BaseURL 的相对 URL。

我的正则表达式是:

((www)\.(.*.)\.((it)|(com)|(org)))?.*.

替换:

$1

所以这应该只提取 BaseURL(如果存在)(就像我在在线模拟器上尝试的那样);相反,如果我有一个没有 BaseURL 的字符串,它会提取“null”字符串而不是空字符串“”。

标签: androidregexreplaceall

解决方案


我们需要更多详细信息,因为您的错误不可重现。由于此测试完美运行:

import org.junit.jupiter.api.Test;

import static org.assertj.core.api.Assertions.assertThat;

public class ReplaceRegex {

    @Test
    void checkRegExp() {
        String regex = "((((first_url)|(second_url)|(third_url))+\\.dom\\.local)?|.*)[^.]";
        String t1 = "first_url.dom.local/service/myService".replaceAll(regex, "$2").replaceAll("null", "");
        String tt1 = "first_url.dom.local/service/myService".replaceAll(regex, "$2");
        String t2 = "another_url.dom.local/service/myService".replaceAll(regex, "$2").replaceAll("null", "");
        String tt2 = "another_url.dom.local/service/myService".replaceAll(regex, "$2");

        assertThat(t1).isEqualTo("first_url.dom.local");
        assertThat(t1).isEqualTo(tt1);
        assertThat(t2).isEqualTo("");
        assertThat(t2).isEqualTo(tt2);
    }
}

在 Open JDK12 上通过绿色。

你确定你导入的常量是正确的吗?


推荐阅读