1

我正在尝试使用正则表达式拆分字符串,该正则表达式返回数组中的额外元素。请帮忙。以下是程序:

public class Test {
    public static void main(String[] arg){
    String str1 = "{abc}{def}";
    String delim = "[{}]+";

    String[] tokens = str1.split(delim);

    for (int i = 0; i < tokens.length; i++) {
        System.out.println("token value: "+ tokens[i]);
        }        
    }    
}

输出:

token value: 
token value: abc
token value: def

为什么第一个令牌是空字符串?如何解决这个问题?

4

3 回答 3

7

初始元素为空的原因是目标字符串以分隔符开头。所以就像拆分",1,2",导致三个条目一样,第一个是空白的,你会得到相同的结果。(最后你不会得到一个空白,因为String#split除非你给它一个否定的第二个参数,否则显式地删除它们。)

如果您知道字符串将以分隔符开头并且它是一个字符,只需将其删除:

String[] tokens = str1.substring(1).split(delim);

编辑:或者对于一般情况,请参阅 Bohemian 的答案,其中他删除了第一个匹配的分隔符,无论长度如何。

否则,您可以循环:

import java.util.regex.*;

public class SplitTest {
    public static void main(String[] arg){
        String str1 = "{abc}{def}";

        Matcher m = Pattern.compile("\\{([^}]+)\\}").matcher(str1);
        while (m.find()) {
            System.out.println("token value: " + m.group(1));
        }
    }
}

这是该模式字符串的细分:

  • \\{开头的匹配文字{
  • (和对应的后面)创建一个捕获组
  • 在捕获组中,[^}]+意思是“一个或多个不是}
  • 尾随\\}匹配文字}

然后我们遍历字符串中的matches,得到捕获组的值

于 2013-05-13T06:38:13.827 回答
2

问题是它在第一个字符之前分裂。要解决此问题,只需在拆分前去掉前导分隔符:

String[] tokens = str1.replaceAll("^" + delim, "").split(delim);

如果您只需要遍历各个部分(而不是保留数组,则可以将方法的整个工作部分变成两行:

for (String token : str1.replaceAll("^" + delim, "").split(delim))
    System.out.println("token value: " + token);

或者只有一行(只有一个分号!)如果您不介意宽行:

for (String token : str1.replaceAll("^" + delim, "").split(delim)) System.out.println("token value: " + token);
于 2013-05-13T06:35:15.900 回答
0

如果您确定输入的语言/格式,那么您可以这样做:

public class Test {
    public static void main(String[] arg){
    String str1 = "{abc}{def}";

    String[] tokens = str1.split("}");

    for (int i = 0; i < tokens.length; i++) {
        String realToken = tokens[i].substring(1); // This strips off the leading "{"
        System.out.println("token value: " + realToken);
    }
}

为什么原始示例中的前导空字符串标记?这是因为字符串以分隔符开头。想一想:如果它不会在您的案例中返回一个空字符串作为第一个元素,那么当字符串以分隔符开头和不以分隔符开头时,您将如何区分这些情况?

于 2013-05-13T07:09:58.363 回答