为什么split()产生额外的,在集合限制-1之后

时间:2015-06-23 10:38:01

标签: java regex split

我想在没有括号的情况下将电话号码中的区号和前一号码分开,所以我这样做了。

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]在开始时产生并且额外空白,例如 var isAjaxStarted = 0; bkLib.onDomLoaded(function(){ var myEditor = new nicEditor({iconsPath : 'include/nicEdit/nicEditorIcons.gif'}).panelInstance('area1'); if(isAjaxStarted == 0) auto_save_func(myEditor); }); function auto_save_func(myEditor) { isAjaxStarted = 1; draft_content=myEditor.instanceById('area1').getContent(); int_id='<?=$_GET[interview_id]?>'; $.post("ajax_for_auto_save_interview.php", { interview_id: int_id,content:draft_content}, function(data){ isAjaxStarted = 0; }); setTimeout( function() { auto_sav_func(myEditor); }, 100); } 。这是它的行为,还是我在这里做错了什么?

我怎样才能得到预期的结果?

3 个答案:

答案 0 :(得分:3)

首先,你在角色类中有不必要的转义。你的正则表达式与:

相同
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>>

答案 1 :(得分:2)

来自Java8 Oracle docs

  

当此字符串开头有正宽度匹配时   然后在开头包含一个空的前导子串   结果数组。然而,开头的零宽度匹配从不   产生这样空的前导子串。

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

答案 2 :(得分:1)

您的正则表达式存在问题,您的方法也是如此 - 您可以使用任何正则表达式的方法来解决它。你寻求的神奇的单行内容是:

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

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

请参阅live demo

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

制作:

[079, 25894029]