2 回答
TA贡献1845条经验 获得超8个赞
仅供参考: nextLine()读取lines,而不是tokens,因此您的代码未使用定界符。
您需要使用next()来读取标记,正如您现在意识到的那样,您需要一些条件来结束循环。
结束 shell 的常用方法是exit命令。
;由于您希望语句以回车符结尾,因此您需要为此调整分隔符。为了更宽松,在;(正则表达式:\h水平空白字符)之后允许空格,并匹配换行符,而不仅仅是回车符(正则表达式:\R任何 Unicode 换行符序列)。
此外,您需要创建Scanner 外部任何循环。
Scanner scanner = new Scanner(System.in).useDelimiter(";\\h*\\R");
for (;;) {
System.out.print(">");
if (! scanner.hasNext())
break;
String stmt = scanner.next();
stmt = stmt.replaceAll("(?mU:^\\s+\\R)|(?U:\\s+$)", ""); // remove blank lines and trailing spaces
if (stmt.equals("exit"))
break;
System.out.println("Received command: " + stmt);
}
System.out.println("Done!");
示例输出
>test;
Received command: test
> This is a
multi-line test
with blank lines
;
Received command: This is a
multi-line test
with blank lines
>
;
Received command:
>exit;
Done!
TA贡献1836条经验 获得超4个赞
为什么不检查每一行是否包含;?如果是,则附加相关值并跳出循环。
while(true){
Scanner scanner = new Scanner(System.in);
StringBuilder builder = new StringBuilder();
while(scanner.hasNextLine()){
String line = scanner.nextLine();
if (line.contains(";"))
{
String[] parts = line.split(";");
if (parts.length > 0)
{
builder.append(parts[0] + ";");
}
else
{
builder.append(";");
}
break;
}
else
{
builder.append(line);
}
}
System.out.println(builder.toString());
}
添加回答
举报