Java字符串索引超出范围'}'标记不正确/无法正确打印

JustJinnyThings

我目前有这段代码,除了'}'标记外,其余所有代码都有效。如果我输入类似

WOrd 023 {dOor "knob!"}

输出是

`WOrd 023 {dOor "knob!"}
WOrd
word
main.WordToken@33909752
023
23
main.NumberToken@55f96302
{
main.StartToken@3d4eac69
dOor
door
main.WordToken@42a57993
knob!
main.QuoteToken@75b84c92
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.String.substring(Unknown Source)
at main.ScannerBean.scan(ScannerBean.java:85)
at main.Assignment3.main(Assignment3.java:11)`

我很确定startIndex或endIndex出了点问题,但是到目前为止,我还没有做出什么改进。使用其他输入时,不会出现错误,但是'}'仍不会按应有的方式打印。我还注意到,“-”和“ +”标记也没有打印出来。原来的:

package main;
public class ScannerBean implements TokenInterface, ScannerBeanInterface{
String Input;
public ScannerBean(String Input){
    this.Input = Input;
}
public String getInput(){
    return Input;
}
public void setInput(String Input){
    this.Input = Input;
}
public void scan() {
      int startIndex = 0;
      int stopIndex = 0;
      String mySubstring = "";
      boolean isQuote = false;
      while (++stopIndex < Input.length()) {
       if (startIndex >= Input.length()) {
        break;
       }
       if (Input.charAt(startIndex) == '"' || isQuote) {

        isQuote = true;

        if (stopIndex + 1 < Input.length() && Input.charAt(stopIndex + 1) == '"') {


         mySubstring = Input.substring(startIndex+1, stopIndex+1);
         isQuote = false;
         startIndex = stopIndex + 2;
         TokenInterface tt=new QuoteToken(mySubstring);
            System.out.println(tt.getInput());

            TokenInterface quoteToken = new QuoteToken(mySubstring);
            System.out.println(quoteToken.toString());
        }
       }
        else if (Character.isLetter(Input.charAt(startIndex))){
            if (!Character.isLetter(Input.charAt(stopIndex)) || Input.charAt(stopIndex) == '}'){
                mySubstring = Input.substring(startIndex, stopIndex);
                startIndex = stopIndex + 1;

                TokenInterface tt=new WordToken(mySubstring);
                System.out.println(tt.getInput());

                WordTokenInterface w = new WordToken(mySubstring);
                System.out.println(w.getValue());

                System.out.println(w.toString());

            }
        }
        else if (Character.isDigit(Input.charAt(startIndex))){
            if(!Character.isDigit(Input.charAt(stopIndex))){
                mySubstring = Input.substring(startIndex, stopIndex);
                startIndex = stopIndex + 1;

                TokenInterface tt=new NumberToken(mySubstring);
                System.out.println(tt.getInput());

                NumberTokenInterface n = new NumberToken(mySubstring);
                System.out.println(n.getValue());

                System.out.println(n.toString());

            }
        }
        else if (Input.charAt(startIndex) == '{'){
            if(Input.charAt(stopIndex) != '{') {
                mySubstring = Input.substring(startIndex, stopIndex);
                startIndex = stopIndex;

                TokenInterface tt=new StartToken(mySubstring);
                System.out.println(tt.getInput());

                TokenInterface startToken = new StartToken(mySubstring);
                System.out.println(startToken.toString());
            }
        }
        else if (Input.charAt(startIndex) == '}'){
            if(Input.charAt(stopIndex) != '}') {
                mySubstring = Input.substring(startIndex, stopIndex);
                startIndex = stopIndex;

                TokenInterface tt=new EndToken(mySubstring);
                System.out.println(tt.getInput());

                TokenInterface endToken = new EndToken(mySubstring);
                System.out.println(endToken.toString());
            }
        }
        else if (Input.charAt(startIndex) == '-'){
            if(Input.charAt(startIndex) != '-' ){
                mySubstring = Input.substring(startIndex, startIndex+1);
                startIndex = stopIndex;

                TokenInterface tt=new MinusToken(mySubstring);
                System.out.println(tt.getInput());

                TokenInterface minusToken = new MinusToken(mySubstring);
                System.out.println(minusToken.toString());
            }
        }
        else if (Input.charAt(startIndex) == '+'){
            if(Input.charAt(startIndex) != '+' ){
                mySubstring = Input.substring(startIndex,stopIndex);
                startIndex = stopIndex + 1;

                TokenInterface tt=new PlusToken(mySubstring);
                System.out.println(tt.getInput());

                TokenInterface plusToken = new PlusToken(mySubstring);
                System.out.println(plusToken.toString());
            }
        }
        else if (Input.charAt(stopIndex) == ' '){
            startIndex++;
        }
}
}
}
肉桂

当您在此处获得子字符串时

 else if (Input.charAt(startIndex) == '}'){
        if(Input.charAt(stopIndex) != '}') {
            mySubstring = Input.substring(startIndex, stopIndex);

startIndex大于stopIndex我建议使用重写整个过程java.util.Scanner,除非有某些充分的理由使您不愿意或不愿意。

您可以使用它的findWithinHorizon(Pattern, int)方法为您完成大部分工作,前提是您给它正确Pattern的。next...()但是,在使用方法时要小心-它们始终带有一个完整的标记(由两侧的分隔符分隔),除非您更改分隔符,否则这不是您想要的。

这是一个有关如何使用它的简单示例:

static final Pattern WORD = Pattern.compile("\\G[a-zA-Z]+");
static final Pattern NUMBER = Pattern.compile("\\G\\d+");
static final Pattern LEFT = Pattern.compile("\\G\\{");
static final Pattern RIGHT = Pattern.compile("\\G\\}");
static final Pattern QUOTES = Pattern.compile("\\G\"");
static final Pattern QUOTED_CHARS = Pattern.compile("\\G[^\"]*");
static final Pattern WHITESPACE = Pattern.compile("\\G\\s*");

public static void main(String[] args) {

    String s = "WOrd 023 \"\"{dOor \"knob!\"}";
    Scanner sc = new Scanner(s);

    while (true) {

        sc.skip(WHITESPACE);
        if (!sc.hasNext()) {
            break;
        }

        String token;

        if ((token = sc.findWithinHorizon(WORD, 0)) != null) {
            System.out.println("word: " + token);
        } else if ((token = sc.findWithinHorizon(NUMBER, 0)) != null) {
            System.out.println("number: " + token);
        } else if ((token = sc.findWithinHorizon(LEFT, 0)) != null) {
            System.out.println("left: " + token);
        } else if ((token = sc.findWithinHorizon(RIGHT, 0)) != null) {
            System.out.println("right: " + token);
        } else if ((token = sc.findWithinHorizon(QUOTES, 0)) != null) {
            token = sc.findWithinHorizon(QUOTED_CHARS, 0);
            System.out.println("quoted: '" + token + "'");
            sc.findWithinHorizon(QUOTES, 0);
        }
    }
}

有关详细信息,请在此处查看:

http://docs.oracle.com/javase/8/docs/api/java/util/Scanner.html

http://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

存储在结构中的字符串打印不正确

来自分类Dev

堆栈超出范围。也许调用不正确?

来自分类Dev

范围不正确

来自分类Dev

curl错误:无法解析主机,java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

来自分类Dev

不正确的JSON字符串

来自分类Dev

从Java中的行读取字符串-StringIndexOutOfBoundsException:字符串索引超出范围

来自分类Dev

字符串索引超出范围异常,字符串索引超出范围

来自分类Dev

索引到字符串时输出不正确

来自分类Dev

Java字符串索引超出范围错误

来自分类Dev

Java中的字符串索引超出范围错误

来自分类Dev

java打印:纸张尺寸不正确

来自分类Dev

Vlookup超出范围,返回不正确的Value或#N / A

来自分类Dev

ASCII复选标记字符导致不正确的框

来自分类Dev

字符串格式不正确

来自分类Dev

为什么在打印列表时没有错误时出现IndexError:字符串索引超出范围?

来自分类Dev

字符串长度不正确

来自分类Dev

Java ME:ActionEvent之类超出范围/多种形式的设置不正确

来自分类Dev

在字符串中打印不正确的字符数

来自分类Dev

字符串索引超出范围异常Java

来自分类Dev

范围不正确

来自分类Dev

IndexError:字符串索引超出范围,无法读取十六进制文件

来自分类Dev

字符串索引超出范围异常,字符串索引超出范围

来自分类Dev

Win32编辑打印不正确的字符

来自分类Dev

终端输出不正确,字符无法打印

来自分类Dev

字符串超出范围-Java

来自分类Dev

Vlookup超出范围,返回不正确的Value或#N / A

来自分类Dev

字符串格式不正确

来自分类Dev

Java-字符串索引超出范围错误

来自分类Dev

我无法解决这个问题:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:54

Related 相关文章

  1. 1

    存储在结构中的字符串打印不正确

  2. 2

    堆栈超出范围。也许调用不正确?

  3. 3

    范围不正确

  4. 4

    curl错误:无法解析主机,java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:-1

  5. 5

    不正确的JSON字符串

  6. 6

    从Java中的行读取字符串-StringIndexOutOfBoundsException:字符串索引超出范围

  7. 7

    字符串索引超出范围异常,字符串索引超出范围

  8. 8

    索引到字符串时输出不正确

  9. 9

    Java字符串索引超出范围错误

  10. 10

    Java中的字符串索引超出范围错误

  11. 11

    java打印:纸张尺寸不正确

  12. 12

    Vlookup超出范围,返回不正确的Value或#N / A

  13. 13

    ASCII复选标记字符导致不正确的框

  14. 14

    字符串格式不正确

  15. 15

    为什么在打印列表时没有错误时出现IndexError:字符串索引超出范围?

  16. 16

    字符串长度不正确

  17. 17

    Java ME:ActionEvent之类超出范围/多种形式的设置不正确

  18. 18

    在字符串中打印不正确的字符数

  19. 19

    字符串索引超出范围异常Java

  20. 20

    范围不正确

  21. 21

    IndexError:字符串索引超出范围,无法读取十六进制文件

  22. 22

    字符串索引超出范围异常,字符串索引超出范围

  23. 23

    Win32编辑打印不正确的字符

  24. 24

    终端输出不正确,字符无法打印

  25. 25

    字符串超出范围-Java

  26. 26

    Vlookup超出范围,返回不正确的Value或#N / A

  27. 27

    字符串格式不正确

  28. 28

    Java-字符串索引超出范围错误

  29. 29

    我无法解决这个问题:java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:54

热门标签

归档