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

Java String.split()的副作用,还是regexp错误?,java,string,Java,String,我尝试通过string.split(regexp)方法,使用next regexp:“[\\[(*?)\]]”“或“\[\\\\\\\\\\\]”或”或“\[\\\\\[\\\\\]”或“\[\\[\\\\\\[\\\\\\]]”解析字符串,并将其拆分为 但该方法始终返回数组[“”、“01.02.2016”、“”、“0”]。 是String.split(regexp)的正常结果,还是我在regexp中的错误?尝试此[问题已解决] 输出 试试这个[问题解决了] 输出 String.split尝试查

我尝试通过
string.split(regexp)
方法,使用next regexp:
“[\\[(*?)\]]”“
“\[\\\\\\\\\\\]”或
“\[\\\\\[\\\\\]”或
“\[\\[\\\\\\[\\\\\\]]”解析字符串
,并将其拆分为

但该方法始终返回数组
[“”、“01.02.2016”、“”、“0”]
。 是
String.split(regexp)
的正常结果,还是我在regexp中的错误?

尝试此[问题已解决] 输出 试试这个[问题解决了] 输出
String.split
尝试查找与您的模式匹配的项,并相应地进行分割。 例如,您希望基于逗号和分号拆分字符串。 在这种情况下,您将用作“regexp”
,|

在您的情况下,如果使用,例如
“\\[\124;\\]”
,这意味着当它找到一个开括号或一个闭括号时,它将被拆分。 因此,在第一个打开括号之前为空,在同一括号之后和关闭括号之前为空,在关闭和打开之间为空,依此类推


正如@TheLostMind所建议的,您希望使用
模式
匹配器
和组来代替。

字符串.split
尝试查找模式的匹配项,并相应地进行拆分。 例如,您希望基于逗号和分号拆分字符串。 在这种情况下,您将用作“regexp”
,|

在您的情况下,如果使用,例如
“\\[\124;\\]”
,这意味着当它找到一个开括号或一个闭括号时,它将被拆分。 因此,在第一个打开括号之前为空,在同一括号之后和关闭括号之前为空,在关闭和打开之间为空,依此类推

正如@TheLostMind所建议的,您希望使用
模式和
匹配器和组来代替。使用和可能的解决方案可以是:

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 = []
part = 01.02.2016
part = 0
part = 
编辑,如所述。如果您想要获得不带周围支架的零件,请按如下所示修改代码

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 = []
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+4]5";
System.out.println(Arrays.toString(s.split("[\\[+\\]]")));
// output
[1, 2, 3, 4, 5]
\\[\\]
-用作定界器
[
]

String s = "1[2]3";
System.out.println(Arrays.toString(s.split("\\[|\\]")));
// output
[1, 2, 3]
[\\[+\]
-使用
[+]
的任何字符作为定界符(因为它们分组在
[…]

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+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 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 = []
part = 01.02.2016
part = 0
part = 
按照注释进行编辑。如果您想要获得没有周围括号的零件
[]
请按以下方式修改代码

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 = []
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+4]5";
System.out.println(Arrays.toString(s.split("[\\[+\\]]")));
// output
[1, 2, 3, 4, 5]
\\[\\]
-用作定界器
[
]

String s = "1[2]3";
System.out.println(Arrays.toString(s.split("\\[|\\]")));
// output
[1, 2, 3]
[\\[+\]
-使用
[+]
的任何字符作为定界符(因为它们分组在
[…]

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+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(regexp)
根据分隔符拆分字符串,它不会解析字符串。使用
模式和
匹配器来匹配并从String中获取匹配的组,是的,这确实是预期的行为
String.split(regexp)
根据分隔符拆分字符串,它不解析字符串。使用
模式
匹配器
从字符串中匹配并获得匹配的组,是的,这确实是预期的行为。如果不想找到空括号对,您可以将
*
替换为
+
。您应该使用
()
为了分组并只返回括号内的文本作为OP needsThnks,我使用了Pattern和Matcher,但还想知道String.split()的预期结果。@SubOptimal,nice.Thnks,我不理解我的错觉。只是混淆了split方法和real regexp之间的行为。可能是因为方法声明为:public String[]split(String regex)。或者,如果不想找到空的括号对,可以将
*
替换为
+
。您应该使用
()
将括号内的文本分组并仅返回操作所需的文本。我使用Pattern和Matcher,但还想知道String.split()的预期结果是什么@SubOptimal,nice.Thnks,我不理解我的错觉。只是混淆了split方法和real regexp之间的行为。可能是因为方法声明为:public String[]split(String regex)。您的解决方案目前还不是最优的。首先,您将所有与“数字”或句点不匹配的内容替换为空格。本质上,您将替换“]”和“['个字符加一个空格。然后修剪它,从字符串的开头和结尾删除空格。然后进行另一个regexp过程,对任何与“数字”或句点不匹配的字符串进行拆分。本质上,您是在空格字符上进行拆分,因此为什么x1[1]是一个空字符串。请查看上面的解决方案,这些解决方案显示了对regexp的更好理解。您的解决方案到目前为止还不是最优的。首先,您将所有与“数字”或句点不匹配的内容替换为空格。本质上,您将替换“]”和“['个字符加空格。然后修剪它,删除字符串开头和结尾的空格。然后执行另一个regexp过程以在任意位置拆分字符串