2017-10-13 496 views
2

这可能是一个超级愚蠢的问题,但我无法弄清楚为什么StringEscapeUtils以这种方式行事。在java中转义点。 (StringEscapeUtil)

这是一个的失败,并出现以下错误第二断言:

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(); 
    } 
+0

你想考什么实际? – Ravi

+0

单元测试应该通过...我试图测试我的逃生方法,可以正确逃脱。 E.g.在英文中,如果没有Java修改它,'.'应该导致'\。''\'应该导致'\\',以便\和转义字符在转义时是明确的。 –

回答

2

你永远都填静态地图ESCAPE_MAPUNESCAPE_MAP,因为你忘记了关键字static。

下面是正确的代码

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

谢谢,上帝,我觉得愚蠢。 –

0

我想:

而不是

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(".", "\\."); 
     } 
    }; 
+0

虽然这起作用,但它被广泛认为是Java反模式。它几乎没有理由创建一个新的子类,只是为了拥有更好的语法。 –

+0

我同意。我希望Java有朝一日能够包含一个声明内联Map的方法...... – Tuco