【问题标题】: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 个 \\\ 是多余的。

标签: java regex tokenize single-quotes


【解决方案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 中有效:"\'(\\\'|[^\'])*?\'|[^ ]+"
猜你喜欢
  • 2012-08-03
  • 2015-09-14
  • 1970-01-01
  • 2019-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多