Java拆分带引号的字符串

为了写一个用来操作RedisRESTful API,需要把输入的命令字符串拆分为数组,内部使用jedis库实现Redis操作,遇到的问题是拆分时,引号内的内容怎样在拆分时视作一个整体。

下面是一段示例代码

String line = "hmset user:1 name zlikun ctime \"2017-9-1 12:00:00\" utime \"2017-9-18 14:27:00\"" ;

// 目标:将命令拆分为数组,但引号内的内容不能拆分,效果如下:
// [hmset ,user:1 ,name ,zlikun ,ctime ,2017-9-1 12:00:00 ,utime ,2017-9-18 14:27:00]

// 错误示例,按空白字符(这里主要针对空格)拆分,日期被拆成两部分了!
// hmset, user:1, name, zlikun, ctime, "2017-9-1, 12:00:00", utime, "2017-9-18, 14:27:00",
Arrays.stream(line.split("\\s+")).forEach(s -> {
    System.out.print(s + ", ");
});

// 正确示例 。。。

补充答案(2017/9/19 16:23)
经过测试,我使用正则实现了同样结果

String line = "hmset user:1 name zlikun ctime \"2017-9-1 12:00:00\" utime '2017-9-18 14:27:00' description \"I'm a good boy !\"" ;
Pattern pattern = Pattern.compile("('(.*?)'|\"(.*?)\"|\\S+)") ;
Matcher matcher = pattern.matcher(line) ;
while (matcher.find()) {
    String text = null ;
    for (int i = matcher.groupCount(); i > 0; i--) {
        text = matcher.group(i) ;
        if (text != null) break;
    }
    System.out.print(text + ", ");
}
System.out.println();

// hmset, user:1, name, zlikun, ctime, 2017-9-1 12:00:00, utime, 2017-9-18 14:27:00, description, I'm a good boy !, 
慕森卡
浏览 603回答 2
2回答

qq_花开花谢_0

如果只是针对你这种情况,手写个简单的状态机就好了呀: /** * Created by krun on 2017/9/19. */ public class Main { public static void main(String ...args) { String line = "hmset user:1 name zlikun ctime \"2017-9-1 12:00:00\" utime \"2017-9-18 14:27:00\"" ; List<String> list = new LinkedList<>(); boolean IS_STRING = false; StringBuilder builder = new StringBuilder(); for (char c : line.toCharArray()) { switch (c) { case ' ': if (IS_STRING) { builder.append(c); } else { list.add(builder.toString()); builder.setLength(0); } break; case '"': IS_STRING = !IS_STRING; break; default: builder.append(c); } } list.add(builder.toString()); for (String s : list) { System.out.println(s); } } } /** * hmset * user:1 * name * zlikun * ctime * 2017-9-1 12:00:00 * utime * 2017-9-18 14:27:00 */
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java