【问题标题】:Having error from a single line. What did I do wrong?单行出错。我做错了什么?
【发布时间】:2016-05-14 23:07:07
【问题描述】:

这是我的代码:

while(n4.hasNext()){
            sLine = n4.next();
            if(sLine.contains("*")){
                F1 = sLine.indexOf("*");
                L1 = sLine.indexOf("*", F1+1);
                upperC = sLine.substring(F1+1, L1-1);
                upperC = upperC.toUpperCase();
//              sLine = sLine.substring(0,F1-1)+upperC+sLine.substring(L1+1, sLine.length() - 1);
            }

在以“sLine”开头的最后一行,由于某种原因,我似乎无法让它到达行尾而不说它

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(Unknown Source)
    at assign3.LoopPatterns.emphasize(LoopPatterns.java:138)
    at assign3.LoopPatterns.main(LoopPatterns.java:291)

有人可以告诉我我做错了什么吗?小错误是什么?


更新

正在传递的字符串的行是“To you the * victor * of all!”

正在编辑的是 *victor * 到 VICTOR 并放回字符串 sLine。

我正在尝试从 main 方法中指定的扫描仪中获取,然后从扫描仪和大写中获取我在两个星号之间指定的选择。

【问题讨论】:

  • 你想用while循环做什么?也许我们可以帮助您重组代码以简化该行
  • 您正在尝试访问字符串的越界区域。向我们展示发生这种情况的sLine 的值。
  • 更新了我原来的帖子。

标签: java substring variable-length


【解决方案1】:
Dim regex As Regex = New Regex("[\s|\p{P}]?\*[^\s](.*?)[^\s]\*[\s|\p{P}]?")
    '[\s|\p{P}]?\*[^\s] = optional blank space or punctuation followed by '*', followed by anything but blank
    '(.*?) = anything inside both '*'
    '[^\s]\*[\s|\p{P}]? = anything but blank, followed by '*', followed by optional blank space or punctuation
    ' something like this = " *This is a bold text*! This isn't."

这是我几个月前在 VB 中制作的正则表达式,将检测 ** 之间的任何外观,但仅当它们位于文本之前/之后。

*您好!* -> 这是粗体字 *嗨,我的*很大*! -> 完整的句子将在此处加粗。 (是的,想不出更好的例子)

也许它有帮助,你可以使用它。 AFAIR,这适用于文本中的任何数字 *

【讨论】:

    【解决方案2】:

    如果你不知道如何调试,你可以很容易地找到问题: 打印出F1L1的值,找出问题所在。

    这可能是因为你的while循环,当输入为"To you the * victor * of all!"时,它可以正常工作。

    【讨论】:

      【解决方案3】:

      试试这个:

      while(scan.hasNext()){
              sLine = scan.nextLine();
              if(sLine.contains("*")){
                  int F1 = sLine.indexOf("*");
                  int L1 = sLine.indexOf("*", F1+1);
                  String lowerC = sLine.substring(F1+1, L1-1);
                  upperC = lowerC.toUpperCase().trim();                
                  sLine = sLine.replaceAll("\\*\\s*"+lowerC +"\\s*\\*", upperC);
              }
          }
      

      【讨论】:

        【解决方案4】:

        免责声明:这仅在您的字符串上有两个星号时才有效。 (但这应该会给你一个想法。)

        String givenString = "To you the * victor * of all!";
        
        // + 1, because the beginning index is inclusive for of String#substring
        String betweenTheAsterisk = givenString.substring(givenString.indexOf("*") + 1 , givenString.lastIndexOf("*")).toUpperCase().trim();
        System.out.println(betweenTheAsterisk);
        
        // this is a REGEX that basically captures everything between the asterisk, inclusive
        String finalString = givenString.replaceAll("\\*(.*?)\\*", betweenTheAsterisk);
        System.out.println(finalString);
        

        输出:

        VICTOR
        To you the VICTOR of all!
        

        【讨论】:

          【解决方案5】:

          如果行以 * 开头,F1 将为 0。 所以F1-1在这里会是个问题:

          Line = sLine.substring(0,F1-1)
          

          【讨论】:

          • 我正在尝试使用 * victor * 并使其成为不带星号的 VICTOR。
          • 在循环中打印 sLine、F1 和 L1,看看你得到了什么。
          猜你喜欢
          • 2011-06-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-14
          • 2021-04-19
          • 2017-03-13
          • 2017-01-18
          • 2013-06-24
          • 1970-01-01
          相关资源
          最近更新 更多