Can anyone tell me why this is working well:
String wanttosplit = "asdf...23\n..asd12";
String[] i = wanttosplit.split("\n");
output are:
i[0] = asdf...23
i[1] = ..asd12
When i want to get the data from user like:
import java.util.Scanner;
Scanner scan = new Scanner(System.in);
String wanttosplit = scan.next(); //user enter asdf...23\n..asd12 on the keyboard
String[] i = wanttosplit.split("\n");
output are:
i[0] = asdf...23\n..asd12
Why it didnt split like in first example?
答案 0 :(得分:6)
区别在于\n
文字String
中的"asdf...23\n..asd12"
由Java编译器处理,而用户输入asdf...23\n..asd12
则按原样传递给Scanner
Java编译器用换行符(LF)替换转义序列\n
,该字符对应于UNICODE中的代码点10。另一方面,Scanner
会向您传递两个单独的字符'\'
和'n'
,因此当您将字符串传递给split
方法时,它找不到LF代码点分离器。
您需要自己处理转义序列\n
,例如,通过split
传递一个识别它的正则表达式:
String[] i = wanttosplit.split("(?<!\\\\)\\\\n");
答案 1 :(得分:0)
在第二个示例中,用户输入的字符串包含反斜杠后跟字母n,但传递给wanttosplit.split()的参数是包含换行符的单个字符串。
在第一个示例中,wanttosplit包含换行符(因为java编译器已将模式'\ n'替换为表示换行符的单个字符。
答案 2 :(得分:0)
要拆分用户输入\n
,需要在\\n
拆分,因为Java会选择\n
作为换行符。
因此,如果您在\
前面添加另一个\n
,则java将转义换行符,而是拆分实际文本\n
答案 3 :(得分:0)
看起来你真的通过控制台输入'\'和'n'?扫描仪不会按照该顺序进行处理,而是将其视为原样。
从Scanner获取输入时,您也不需要分割线,因为Scanner在执行next()时始终会给您一行
如果您想从用户读入多行,则应多次调用next()。