为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 中模拟 SQL shell 模拟器

在 Java 中模拟 SQL shell 模拟器

神不在的星期二 2023-06-14 14:30:56
我想用 Java 模拟一个模拟 SQL shell。我们的想法是我们键入一行文本并终止它,;然后按回车键,该行将打印回控制台。这应该能够接受多行文本,一旦有一个;回车符,它应该打印出文本。这是我的代码:while(true){      Scanner scanner = new Scanner(System.in).useDelimiter(";");      StringBuilder builder = new StringBuilder();      while(scanner.hasNextLine()){         if(scanner.nextLine().endsWith(";")){            builder.append(scanner.nextLine());            break;          }else{            builder.append(scanner.nextLine());          }          }            System.out.println(builder.toString());        }这是行不通的,因为它永远不会退出内部 while 循环。
查看完整描述

2 回答

?
精慕HU

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!


查看完整回答
反对 回复 2023-06-14
?
HUH函数

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());

        }


查看完整回答
反对 回复 2023-06-14
  • 2 回答
  • 0 关注
  • 147 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信