字符串数组长度的差异与相同输入的相同正则表达式

时间:2015-04-27 04:10:06

标签: java regex

下面的代码将\n上的字符串拆分。对于小输入它确实有效但长输入它不能按预期工作\n。    为了调查相同的讨论here。 用于验证行为的书面测试用例。    它正如\n所期望的那样,因为当我尝试使用该程序时,我在\\\\n测试正确的答案中有一个建议我在字符串数组长度计算方面有所不同。    下面有代码和我发现的差异。

public String[] token=new String[10];
public Addnumber(String input) {
    // TODO Auto-generated constructor stub
    this.token=input.split("\n");
    System.out.println("Inside constructor Length="+token.length);
    for(String s:token)
        System.out.println(s);
}

public static void main(String[] args) {
     String input="hi\niam\nhere";
     String input1="hi\niam\nhere";
     String input2="x = [2,0,5,5]\ny = [0,2,4,4]\n\ndraw y #0000ff\ny = y & x\ndraw y #ff0000";
     new Addnumber(input1);//calculating via constructor
     new Addnumber(input2);
     String[] istring=new String[10];
     //Calculating in main method
     // General expression of \n
     istring=input.split("\n");
     System.out.println("Length calcluated when \n as regex="+istring.length);
     for(String s:istring)
          System.out.println(s);    
     istring=input2.split("\\\\n");   //Check the  regex used here
     System.out.println("Length calcluated when \\\\n as regex="+istring.length);
     for(String s:istring)
         System.out.println(s);
}

开启执行此程序输出如下

Inside constructor Length=3
hi
iam
here
Inside constructor Length=6
x = [2,0,5,5]
y = [0,2,4,4]

draw y #0000ff
y = y & x
draw y #ff0000
Length calcluated when 
as regex=3
hi
iam
here
Length calcluated when \\n as regex=1
x = [2,0,5,5]
y = [0,2,4,4]

draw y #0000ff
y = y & x
draw y #ff0000

请注意,当\n是正则表达式时,字符串数组的长度是预期的,但当\\\\n作为正则表达式时,它显示的长度为1但是     拆分的内容与之前相同。为什么正则表达式改变时长度计算的差异? :

2 个答案:

答案 0 :(得分:1)

我认为你有点错过my answer对上述问题的观点。

使用split("\\n")拆分字符串时,请用换行符分隔它。

使用split("\\\\n")拆分字符串时,您会按字面顺序\n拆分。

original question中,字符串是通过用户输入获得的,用户从字面上输入\n。因此,需要使用\\\\n来正确拆分它。

如果要模拟文字\n用户输入,则示例字符串应如下所示:

String input2 = "x = [2,0,5,5]\\ny = [0,2,4,4]\\n\\ndraw y #0000ff\\ny = y & x\\ndraw y #ff0000";

如果您想知道为什么在上一个示例中,它显示长度为1,但仍然将字符串部分呈现在不同的行上:它只是输入字符串中正在呈现的换行符。

答案 1 :(得分:0)

split("\n")按换行符拆分。你在字符串中有这个,所以你得到了分裂。

split("\\\\n")按反斜杠和换行符分割。正则表达式和Java字符串都具有转义语义,因此字符串"\\\\n"实际上是正则表达式\\n(反斜杠和n)。 "\n"在正则表达式中生成一个文字换行符; "\\n"生成正则表达式\n,正则表达式引擎读取为换行符。这两个都会让你分手换线;但大概是,你的字符串不包含后跟n的反斜杠,所以split("\\\\n")失败并返回你开始使用的那个元素。