Java 有一行错误的。我做错了什么?

Java 有一行错误的。我做错了什么?,java,substring,variable-length,Java,Substring,Variable Length,这是我的密码: while(n4.hasNext()){ sLine = n4.next(); if(sLine.contains("*")){ F1 = sLine.indexOf("*"); L1 = sLine.indexOf("*", F1+1); upperC = sLine.substring(F1+1, L1-1);

这是我的密码:

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)
有人能告诉我我做错了什么吗?小错误是什么


更新

传递的字符串行是“给你所有人中的胜利者!”

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


我试图从主方法指定的扫描器中获取,然后从扫描器和上框中获取两个星号之间的指定选择。

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

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

免责声明:仅当字符串上有两个星号时,此选项才有效。(但这应该会给你一个想法。)

输出:

VICTOR
To you the VICTOR of all!
试试这个:

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

如果您不知道如何调试,您可以很容易地找到问题: 打印出
F1
L1
的值并找出问题所在

这可能是因为您的while循环,当输入是
“您是所有人中的*victor!”
时,它工作正常

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中制作的一个正则表达式,将检测**之间的任何外观,但仅当它们正好位于文本之前/之后时

*Hi there!* -> This is bolded out *Hi, my * is quite big*! ->The full sentence will be bolded here. (Ya, couldn't think of a better example) *你好!*->这是大胆的 *嗨,我的*很大*!->完整的句子将在这里加粗。(是的,想不出更好的例子了)
也许它有帮助,你可以使用它。AFAIR,这适用于文本中的任意数字*

您想用while循环做什么?也许我们可以帮助您重新构造代码,以简化试图访问字符串越界区域的行。向我们显示发生此情况的
sLine
的值。更新了我的原始帖子。我正在尝试使用*victor*并使其显示victor而不带星号。在循环中打印sLine、F1和L1,看看您得到了什么。 *Hi there!* -> This is bolded out *Hi, my * is quite big*! ->The full sentence will be bolded here. (Ya, couldn't think of a better example)