开发者社区> 问答> 正文

Split字符串分拆

我有这么一个字符串String str = "sh -c 'ls / -lh'"
我想按空格拆成一个数组String[]{"sh", "-c", "'ls / -lh'"}
哪位能写个算法吗?就是说用单引号或双引号包起来的字符串不按空格拆分。

Java语言最好,其他语言也行。

展开
收起
lifubang 2017-12-01 18:13:11 2582 0
4 条回答
写回答
取消 提交回答
  • 通常可以使用String类的split方法来分拆,也可以使用google的guava库中Splitter,如Splitter.on(",").split(str)
    2019-07-17 21:46:56
    赞同 1 展开评论 打赏
  • public static void main(String[] args) {

        String str = "sh -c 'ls / -lh'";
        char[] dataArray = str.toCharArray();
        List<String> result = new ArrayList<>();
        int pos = 0;
        boolean symbol = false;
        for(int i=-0; i<dataArray.length;i++){
            if(dataArray[i]=='\'' || dataArray[i]=='\"'){
                if(symbol){
                    symbol = false;
                }else{
                    symbol = true;
                }
            }else if(dataArray[i]==' ' && !symbol){
                result.add(new String(dataArray,pos,i-pos));
                pos = i+1;
            }
        }
        if(pos<dataArray.length-1){
            result.add(new String(dataArray,pos,dataArray.length-pos));
        }
        System.out.println();
    }
    2019-07-17 21:46:56
    赞同 展开评论 打赏
  • 什么都感兴趣?

    需要一个分词器的实现, 没考虑边缘case和转义,可以尝试自己加下:)

    public static void main(String[] args) {
        String input = "sh -c 'ls / -lh'";
        
        int begin=0;
        boolean flag = false;
        
        List result = new ArrayList();
        
        for(int i=0;i<input.length()+1;i++) {
            
            char c;
            if (i>=input.length()) {
                c=' ';
            } else {
                c = input.charAt(i);
            }
            
            switch (c) {
            case ' ':
                if (!flag) {
                    if(begin != i) {
                        result.add(input.substring(begin, i));
                    }
                    begin=i+1;
                }
                break;
            case '\'':
                if(flag) {
                    flag = false;
                    result.add(input.substring(begin, i));
                } else {
                    flag = true;
                    if(begin != i) {
                        result.add(input.substring(begin, i));
                    }
                }
                begin=i+1;
                break;
            default:
                break;
            }
            
        }
        
        System.out.println("result = " + result);
    
    }
    2019-07-17 21:46:56
    赞同 展开评论 打赏
  • 每搜索到一个空格,就把前面的字符串加到数组就可以吧.

    2019-07-17 21:46:56
    赞同 1 展开评论 打赏
问答分类:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载