2015-04-27 2 views
1

Ниже код разделен на строку \n. Для небольшого ввода он работает, но длинный ввод не работает так, как ожидалось, для того же \n. Чтобы исследовать то же самое, обсуждалось here. Написанная тестовая версия для проверки поведения. Он работает так, как ожидалось, для \n, где, как было предложено в ответе на тестирование с \\\\n в качестве регулярного выражения, когда я пытался с этой программой, я получил разницу в вычислении длины строки. Ниже приведен код и несоответствие, которое я нашел.Несоответствие длины строки String с тем же самым регулярным выражением для одного и того же ввода

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, но в разделение содержимого такое же, как и предыдущее. Почему расхождение в вычислении длины при изменении выражения регулярного выражения? :

ответ

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, но все же отображает строковые части на отдельных строках: это только символы новой строки в вашей входной строке, которые отображаются.

+0

Здесь возникает вопрос, почему значение длины строки массива показывает 1, когда оно может разделить контент успешно? –

+0

Ничего не разделено. Ваш вывод просто отображает новые строки, которые находятся в вашей строке ввода. –

+1

Спасибо, Робби за разъяснение. –

0

split("\n") распадается на новую строку. У вас это в вашей строке, поэтому вы получаете раскол.

split("\\\\n") разделяет обратную косую черту и новую линию. Оба регулярных выражения и строки Java имеют escape-семантику, поэтому строка "\\\\n" на самом деле является регулярным выражением \\n (обратная косая черта и n). "\n" создает буквенную строку новой строки в регулярном выражении; "\\n" создает регулярное выражение \n, которое движок регулярного выражения читает как новую строку. Обе из них дадут вам раскол на новостях; но предположительно, ваша строка не содержит обратную косую черту, за которой следует n, поэтому split("\\\\n") сбой и возвращает вам тот элемент, с которого вы начали.

Смежные вопросы