为什么 split() 在设置 limit -1 之后产生额外的 ,

why split() produces extra , after sets limit -1

我想将区号和前面的号码与电话号码分开而不用括号,所以我这样做了。

String pattern = "[\(?=\)]";
String b = "(079)25894029".trim();
String c[] = b.split(pattern,-1);
for (int a = 0; a < c.length; a++)
    System.out.println("c[" + a + "]::->" + c[a] + "\nLength::->"+ c[a].length());

输出:

c[0]::-> Length::->0
c[1]::->079 Length::->3
c[2]::->25894029 Length::->8

预期输出:

c[0]::->079 Length::->3
c[1]::->25894029 Length::->8

所以我的问题是为什么 split() 在开始时会产生额外的空白,例如 [, 079, 25894029]。这是它的行为,还是我在这里做错了什么?

如何获得预期的结果?

首先你的角色内部有不必要的转义class。您的正则表达式与:

String pattern = "[(?=)]";

现在,您得到一个空的结果,因为 ( 是字符串中的第一个字符,在第 0 个位置拆分确实会导致一个空字符串。

要避免该结果,请使用此代码:

String str = "(079)25894029";
toks = (Character.isDigit(str.charAt(0))? str:str.substring(1)).split( "[(?=)]" );
for (String tok: toks)
    System.out.printf("<<%s>>%n", tok);

输出:

<<079>>
<<25894029>>

来自Java8 Oracle docs

When there is a positive-width match at the beginning of this string then an empty leading substring is included at the beginning of the resulting array. A zero-width match at the beginning however never produces such empty leading substring.

您可以检查第一个字符是否为空字符串,如果是则trim那个空字符串字符。

您的正则表达式有问题,您的方法也有问题 - 您无法将您的方法与任何正则表达式一起使用来解决它。您寻找的神奇单线是:

String[] c = b.replaceAll("^\D+|\D+$", "").split("\D+");

这将删除所有 leading/trailing 非数字,然后拆分非数字。这将处理许多不同的格式和分隔符(自己尝试一些)。

参见 live demo 的:

String b = "(079)25894029".trim();
String[] c = b.replaceAll("^\D+|\D+$", "").split("\D+");
System.out.println(Arrays.toString(c));

制作这个:

[079, 25894029]