【问题标题】:Space is taking after every String每个字符串都占用空间
【发布时间】:2016-08-09 08:25:39
【问题描述】:
String delimiterStr = "|", line="1231|08062016|4441|10|PayeeName1|REF1";
String ISSUE_UPLOAD_FILE_PATTERN = "(?<=(^|" + delimiterStr + "))(([^\"" + delimiterStr + "]*)|\"([^\"]*)\")(?=($|" + delimiterStr + "))";

List<String> splitString = new ArrayList<String>();
Matcher matcher = Pattern.compile(ISSUE_UPLOAD_FILE_PATTERN).matcher(line);
while (matcher.find()) {
  if (matcher.group(3) != null) {//NOPMD,old code
    System.out.println(matcher.group(3));
    splitString.add(matcher.group(3));
  } 
}
System.out.println(splitString.size()+"::--->"+splitString);

OutPut :-  12::--->[1231, , 08062016, , 4441, , 10, , PayeeName1, , REF1, ]

如您在输出中看到的,上述模式在每个拆分字符串后占用空间。我不想在每个字符串之后占用空间。如果输入字符串中存在空间,则需要占用空间,否则不应占用空间。我的模式需要做哪些改变?

【问题讨论】:

  • 不,不是。使用 for-each 循环打印输出。你不会看到空格。

标签: java pattern-matching matcher


【解决方案1】:

它的行为符合预期。当在ArrayList 上调用toString() 时,它使用AbstractCollection 的实现,如下所示:

public String toString() {
    Iterator<E> it = iterator();
    if (! it.hasNext())
        return "[]";

    StringBuilder sb = new StringBuilder();
    sb.append('[');
    for (;;) {
        E e = it.next();
        sb.append(e == this ? "(this Collection)" : e);
        if (! it.hasNext())
            return sb.append(']').toString();
        sb.append(',').append(' '); // adds space
    }
}

您可以添加一个简单的循环来验证没有为每个元素添加空格:

        for (String s : splitString) {
            System.out.println(s + "X");
        }

【讨论】:

  • String ISSUE_UPLOAD_FILE_PATTERN = "([^\"|]*)"; 你能解释一下上面的模式需要什么值吗?它也需要空间吗?
  • @RBP - 它匹配除引号和 | 之外的任何内容。
  • (?
【解决方案2】:

ISSUE_UPLOAD_FILE_PATTERN = "(?[^" + delimiterStr + "])|\"([^ \"])\")(?=($|" + delimiterStr + "))";

Above Pattern 解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-22
    • 2014-07-29
    • 2018-02-20
    • 1970-01-01
    • 2011-11-21
    • 2018-07-30
    • 2015-01-27
    相关资源
    最近更新 更多