为什么 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>>
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]
我想将区号和前面的号码与电话号码分开而不用括号,所以我这样做了。
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>>
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]