为了账号安全,请及时绑定邮箱和手机立即绑定

Java拆分带引号的字符串

Java拆分带引号的字符串

慕森卡 2019-03-01 10:31:00
为了写一个用来操作Redis的RESTful 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 !,
查看完整描述

2 回答

?
qq_花开花谢_0

TA贡献1835条经验 获得超7个赞

如果只是针对你这种情况,手写个简单的状态机就好了呀:


/**
 * 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
 */
查看完整回答
反对 回复 2019-03-01
  • 2 回答
  • 0 关注
  • 602 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信