【问题标题】:Determine the end of the string in Java在Java中确定字符串的结尾
【发布时间】:2023-04-09 12:04:01
【问题描述】:

我正在尝试使用 Lexer 来确定输入中是否包含 String/Integer/Double/etc。我已经成功确定我是否正在处理字符串以外的任何其他内容,但我无法弄清楚如何处理字符串部分。

假设我有三个输入:

input = "\"asd\""
input2 = "\"The string \"String\" is really great\"5432"
input3 = "\"The string \"String\" is really great\"5432"\One more\""

Expected output from:
input = <STRING:asd> //Works with current code
input2 = <STRING:The string "String" is really great><INTEGER 5432> //Broken
input3 = <STRING:The string "String" is really great><INTEGER 5432> <STRING:One more>//ALSO BROKEN

输出处理已经完成并且正在工作,所以这不是问题,问题是处理字符串如何结束。 处理不包含引号的字符串很容易,这就是我目前的处理方式:

    StringBuilder sb = new StringBuilder();
    int count = 1;
    pos++;
    current = input.charAt(pos);
    boolean last = false;
    char next = input.charAt(pos+1);
    while (current != '"'){
        sb.append(current);
        pos++;
        current = input.charAt(pos);
        next = input.charAt(pos+1);
    }
    tokens.add(new Token(TokenType.STRING,sb.toString()));

现在在我的代码中,当第一个引号出现在 String 中时就会出现问题(例如,参见 input2 或 input3)。我正在逐个字符地检查输入字符,else-if 分支由引号开始确定,这就是为什么存在 pos++ 和当前更新(例如,它指的是 input2 中的 'T' 字符)。

如何确定字符串是否结束(5432 是否是 input2 中的整数而不是第一个字符串的一部分)?

【问题讨论】:

  • 您是否尝试过使用input.length 属性来循环直到达到要解析的字符串的长度?
  • 嗯,我可以这样做,但我不知道它对我有什么帮助。如果我有一个字符串“数字是“5324””,我如何确定它是一个字符串而不是 STRING、INTEGER、STRING。
  • 那么函数split()为了直接获取“字符”之间的字符串呢?
  • 我现在用另一种方式解决了这个问题,我改变了标记语法的方式,如果它是java中字符串的开头或结尾,我使用\",否则\\\"

标签: java string


【解决方案1】:

所以基本上根据 Lexer,输入 3 的输出 STRING,INT,STRING 在我的情况下是正确的,因为使用标记 \"doesen 不只是剪切它,我必须在字符串中创建一个引号符号,所以对于 \\\"cuts 它:两个反斜杠中的第一个将显示一个反斜杠本身 \ 并且反斜杠和引号 \" 将在字符串中显示引号。总共显示的字符串是\",它只是一个引号的符号。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-14
    • 2013-04-07
    • 2014-02-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多