String.split()副作用,还是regexp错误?

时间:2016-03-23 12:33:53

标签: java string

我尝试使用"[01.02.2016][0][]"方法解析字符串"01.02.2016""0"String.split(regexp),使用下一个正则表达式:"[\\[(*?)\\]]""\\[|\\]"或{ {1}}。

但是方法总是返回数组"[\\[+\\]]"。 是["", "01.02.2016","","0"]的正常结果,还是我在regexp中的错误?

3 个答案:

答案 0 :(得分:1)

正如TheLostMind所建议的那样。使用PatternMatcher可能的解决方案是:

String s = "[01.02.2016][0][]";
Pattern p = Pattern.compile("(\\[[^\\]]*\\])");
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println("part = " + m.group());
}

输出

part = [01.02.2016]
part = [0]
part = []

修改正如Kuzeko所述。如果您想获得没有周围括号[]的零件,请修改代码如下。

String s = "[01.02.2016][0][]";
Pattern p = Pattern.compile("\\[([^\\]]*)\\]"); // pattern changed
Matcher m = p.matcher(s);
while (m.find()) {
    System.out.println("part = " + m.group(1)); // accessed group changed
}

输出

part = 01.02.2016
part = 0
part = 

修改至问题的第二部分。 String.split按照您的要求工作。请参阅以下示例

[\\[(*?)\\]] - 用作[(*?]的任何字符作为分隔符(因为它们分组在[...]

String s = "1[2(3*4?5)6]7";
System.out.println(Arrays.toString(s.split("[\\[(*?)\\]]")));
// output
[1, 2, 3, 4, 5, 6, 7]

\\[|\\] - 用作分隔符[]

String s = "1[2]3";
System.out.println(Arrays.toString(s.split("\\[|\\]")));
// output
[1, 2, 3]

[\\[+\\]] - 用作[+]的任何字符作为分隔符(因为它们分组在[...]

String s = "1[2[3+4]5";
System.out.println(Arrays.toString(s.split("[\\[+\\]]")));
// output
[1, 2, 3, 4, 5]

如果您未指定结果阈值,则会省略标记空字段。

String s = ",1,2,,,";
System.out.println(Arrays.toString(s.split(",")));
// output
[, 1, 2]
System.out.println(Arrays.toString(s.split(",", 5)));
// output
[, 1, 2, , ,]

有关详细信息如何工作的说明请参阅API String.split(s,int)

答案 1 :(得分:0)

String.split尝试查找您的模式匹配并相应地拆分。 使用的一个示例是您要基于逗号和分号拆分字符串。 在这种情况下,您将使用" regexp" ,|;

在您使用的情况下,例如"\\[|\\]",这意味着当它找到一个开括号或一个闭括号时它会分开。 因此,在第一个开放括号之前,相同之后和关闭之前的日期为空,在关闭和打开之间为空,依此类推。

正如@TheLostMind建议的那样,您想要使用PatternMatcher和组。

答案 2 :(得分:-3)

试试这个[问题解决]

String name ="[01.02.2016][0][]";
        name=name.replaceAll("[^\\d.]", " ").trim();
        String[] x1=name.split("[^\\d.]");
        System.out.println("name = "+x1[0]);
        System.out.println("name = "+x1[2]);

输出

name = 01.02.2016
name = 0