我有需要在Java中使用各种转义字符拆分字符串的情况。格式如下:
id:"description",id:"description",....
id:numeric(int)
description:使用EscapeUtils.escapeJava(input)
转义的字符串,它可以包含任何字符串
可读字符,包括:
,,
甚至"
逃到\"
。
因此,String.split
方法似乎不合适,因为它可能会导致,
或:
的描述出现问题。我知道我可以编写一些可以正常运行的算法,它甚至可以很好地进行测试驱动开发,但是我想知道它是否有一些懒惰的方法并使用某种解析器可以做这种事情? / p>
我的另一种可能的方法是生成一个JSONArray并且不要混淆我不感兴趣的复杂性,但是它将需要一个更多的库依赖,我不相信这个模块中的包含...
所以,我要求的是关于如何解决这类问题的想法(库,使用Java API等)。
答案 0 :(得分:3)
听起来你的字符串应该匹配这个正则表达式:
^(\d+:"([^"\\]|\\.)*"(,(?!$)|$))+$
在这种情况下,您可以通过写下这样的内容将部分提取到Map<Integer, String>
:
private static final Pattern TOTAL_STRING_PATTERN =
Pattern.compile("^(\\d+:\"([^\"\\\\]|\\\\.)*\"(,(?!$)|$))+$");
private static final Pattern PARTIAL_STRING_PATTERN =
Pattern.compile("(\\d+):\"((?:[^\"\\\\]|\\\\.)*)\"");
public Map<Integer, String> parse(final String input) {
if(! TOTAL_STRING_PATTERN.matcher(input).matches()) {
throw new IllegalArgumentException();
}
final Map<Integer, String> ret = new HashMap<Integer, String>();
final Matcher m = PARTIAL_STRING_PATTERN.matcher(input);
while(m.find()) {
final Integer id = Integer.valueOf(m.group(1));
final String description = StringEscapeUtils.unescapeJava(m.group(2));
ret.put(id, description);
}
return Collections.unmodifiableMap(ret);
}
(您可能还需要检查标识符是否在int
范围之外的情况,以及在字符串中多次出现相同标识符的情况,依此类推。想在某些方面使你的模式更灵活,例如,允许冒号和逗号周围的空格。但上述应该是一个良好的开端。)