拆分空格分隔的字符串,忽略单引号内的空格

Posted

技术标签:

【中文标题】拆分空格分隔的字符串,忽略单引号内的空格【英文标题】:splitting a whitespace separated string, ignoring whitespace within single quotes 【发布时间】:2019-04-20 01:10:11 【问题描述】:

我的 Java 输入 String str = "aa 2 xx 'b cc dd e' -o se '4-5'"

我想输出由空格分隔的标记,单引号内的空格除外。 所以,输出应该是:

aa
2
xx
'b cc dd e'
-o
se
'4-5'

我可以通过在空格上拆分字符串,然后合并一系列字符串,如“b、cc、dd、e”来取回“b cc dd e”,但我想要一个更好的方法,可能使用一些正则表达式。

【问题讨论】:

在一般情况下,您确实需要一个解析器来处理这个问题。像can't 这样的收缩词会发生什么?或者,那些永远不会出现? 它们不会按照我的用例出现,整个事情是一个 cmd 行,里面有非常具体的东西。我用很好的正则表达式检查了其他一些帖子,但他们有 \" 而不是我有的未转义的单引号。 尝试使用替代和否定字符类来匹配您的值[^"'\s]+|'[^']+'demo 以下在 java 中有效:"\'(\\\'|[^\'])*?\'|[^ ]+" 连续的 3 个 \\\ 是多余的。 【参考方案1】:

我认为您可以通过迭代字符串并使用布尔值来检测引号来做到这一点。

试试这个:

  public List<String> test(String a)
    final List<String> list = new ArrayList<>();
    boolean quotes = false;
    StringBuilder sb = new StringBuilder();
    for(char c: a.toCharArray())
        if(quotes)
            if('\'' == c) 
                quotes = false;
                if(!sb.toString().isEmpty()) 
                    list.add(sb.toString());
                
                sb = new StringBuilder();
             else 
                sb.append(c);
            
        else 
            if (' ' == c) 
                if (!sb.toString().isEmpty()) 
                    list.add(sb.toString());
                    sb = new StringBuilder();
                
             else if ('\'' == c) 
                quotes = true;//entra na string do quote

             else
                sb.append(c);
            
        
    

    if(!sb.toString().isEmpty())
        list.add(sb.toString());
    
    return list;

【讨论】:

是的,一个有效,只是去掉了单引号。让我们看看是否还会出现正则表达式样式的答案。 嗨拉布拉特。我搜索了正则表达式和形式语法。我认为这个字符串可以用正则语法来表达。然后我们可以找到它的正则表达式。 en.wikipedia.org/wiki/Regular_grammar 以下在 java 中有效:"\'(\\\'|[^\'])*?\'|[^ ]+"

以上是关于拆分空格分隔的字符串,忽略单引号内的空格的主要内容,如果未能解决你的问题,请参考以下文章

在逗号上拆分字符串但忽略双引号内的逗号?

正则表达式在空格上拆分,除非在引号中

正则表达式拆分字符串,不包括可转义引号之间的分隔符

用于根据空格分隔符拆分文本的正则表达式 [重复]

从字符串中以空格分隔和引号括起来的元素获取数据字段

Java Scanner - 除非存在引号,否则用空格分隔?