转义 java 中的点。 (StringEscapeUtils)

Escaping dots in java. (StringEscapeUtil)

这可能是一个超级愚蠢的问题,但我不明白为什么 StringEscapeUtils 会以这种方式运行。

这是第二个失败的断言,错误如下:

org.junit.ComparisonFailure: Did not escape correctly Expected :t\.ext Actual :t.ext

测试

public class ServerDataTest {
    @Test
    public void escape() throws Exception {
        assertEquals("Did not escape correctly", "text", ServerData.escape("text"));
        assertEquals("Did not escape correctly", "t\.ext", ServerData.escape("t.ext"));
        assertEquals("Did not escape correctly", "te\\xt", ServerData.escape("te\xt"));
        assertEquals("Did not escape correctly", "te\\\.xt", ServerData.escape("te\.xt"));
    }
}

逃生工具

private final static Map<CharSequence, CharSequence> ESCAPE_MAP = new HashMap<>();{
        ESCAPE_MAP.put("\", "\\");
        ESCAPE_MAP.put(".",  "\.");
    }

    private static LookupTranslator ESCAPE = new LookupTranslator(ESCAPE_MAP);

    private final static Map<CharSequence, CharSequence> UNESCAPE_MAP = new HashMap<>();{
        UNESCAPE_MAP.put("\\", "\");
        UNESCAPE_MAP.put("\.", ".");
    }

    private static LookupTranslator UNESCAPE = new LookupTranslator(UNESCAPE_MAP);

    static String escape(String text){
        return StringEscapeUtils.builder(ESCAPE).escape(text).toString();
    }

    static String unescape(String text){
        return StringEscapeUtils.builder(UNESCAPE).escape(text).toString();
    }

您永远不会填写静态地图 ESCAPE_MAPUNESCAPE_MAP,因为您忘记了关键字静态。

这是正确的代码

private final static Map<CharSequence, CharSequence> ESCAPE_MAP = new HashMap<>();
static {
    ESCAPE_MAP.put("\", "\\");
    ESCAPE_MAP.put(".",  "\.");
}

我认为:

而不是

private final static Map<CharSequence, CharSequence> ESCAPE_MAP = new HashMap<>();{
        ESCAPE_MAP.put("\", "\\");
        ESCAPE_MAP.put(".",  "\.");
    }

你会写:

private final static Map<CharSequence, CharSequence> ESCAPE_MAP = new HashMap<CharSequence, CharSequence>() {
        {
            put("\", "\\");
            put(".", "\.");
        }
    };