TLDR:我想将多行段落粘贴到控制台中(在方法中使用),但由于 .nextLine() 它只将第一行放入字符串变量中并忽略其余部分。
大家好, 我对 Java 还很陌生,刚刚完成了基础知识。我对术语还是有点不懂。我的任务是一个“解密器”方法,它采用“加密”段落,在方法中交换字母,并打印出“解密”版本:我的解密方法工作得很好。
问题是用户输入:我需要将“加密”的 7 行段落放入控制台,它应该返回“解密”的 7 行段落。我用过scanner.nextLine();这显然不起作用。一旦出现换行符,扫描仪就会停止读取。 (我还注意到,如果您将多行文本/段落复制粘贴到控制台中,控制台会将第一个换行符视为“Enter-Press”)
我确实没有找到任何适合我的问题的解决方法。理想的情况是存在一个scanner.newLine()。 再说一次,我经验不足,现在深感困惑和有点沮丧:,D
首先我尝试通过删除“来删除换行符 ” “ ” “ ”并将其替换为“”
String text = scanner.nextLine();
text = text.replaceAll("\n","");
这不起作用,因为无论如何,初始输入都只能读取到第一个换行符,因此“文本”中没有任何内容可以替换。 我尝试了一些可疑的语法,例如“scanner.replaceAll(” ","").nextLine();"这更是一种绝望的行为。
有一个我真的不明白:
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
scanner.useDelimiter("\n");
scanner.forEachRemaining(System.out::println);
我还发现了“输入要输入多少行”的循环方法,效果很好,但这不是任务的意义。
为了给您提供正确的背景,首先解释一些事情:
System.in
实际上不是键盘。它是“进程的标准输入”,可以是任何东西。它只是“默认情况下”“无论用户输入什么”。例如,java com.foo.MyApp <foo.txt
现在将 System.in
设置为文件 foo.txt
的内容。包括它可以“用完”的概念(键盘永远不会)。因此,当您写nextLine()
时,这与告诉扫描仪不同:请获取所有内容,直到用户按下回车键。
不,它是:获取所有内容,直到流中出现换行符号。 ifSystem.in
是键盘,获取换行符的一种方法是按 Enter 键。另一种方法是按 CMD+V 或任何用于将数据粘贴到终端的方法,并且该数据包含换行符。 Scanner
实际上无法区分这两件事。因此,没有方法可以走:“获取所有文本,直到用户按回车键”。因为这个方法如何发挥作用呢? Enterpress 看起来与粘贴数据中的换行符相同。 “好吧,这就是我想要输入的所有内容,请继续处理它”的信号需要成为数据的一部分。如果它不是“换行符”(因为您想捕获多段落的内容),那么您将不得不想出其他东西。
nextLine()
是一个你永远不应该使用的坏方法。它的功能完全符合其规格说明,但实际情况并非您所想象的那样。相反,这是毫无用处的东西。扫描仪将尽职尽责地继续让 nextLine()
成为这个无用的东西,与扫描仪上的所有其他
.next
操作进行各种令人惊讶的(阅读:不需要的)交互。相反,如果您想要字符串输入,请使用 .next()
,如果默认分隔符(即:任何空格,即如果您键入“Hello, World!”并按 Enter 键,则第一个“标记”为“你好,”第二个是“世界!”。如果您不想这样,请将分隔符设置为“换行符”。例如)。
考虑到这一点:
这是一种方法:System.out.println("Paste your paragraph, then hit enter and type 'DONE' and hit enter again:");
scanner.useDelimiter("(?i)\\RDONE\\R");
String data = scanner.next();
System.out.println("Your paragraph contains: " + data.length() + " symbols.");
这告诉扫描器“分隔每个输入标记的东西”是换行符,然后是文本 DONE,然后是换行符(各种操作系统使用不同的符号序列作为换行符,
\\R
涵盖了所有这些。
\n
可能也有效,但是
\\R
对所有东西都有效)。 (?i)
只是表示 DONE
部分不区分大小写。.useDelimiter
的参数是一个正则表达式,它是它自己的迷你编程语言,用于描述常规语法,这就是为什么你可能会觉得很奇怪,你可以把(?i)
放在那里,这意味着“不区分大小写” ' 不知何故。我们确实在这些字符串引号内压缩了一个小程序。