Java 工作场所与字符串相关的编程问题

Java 工作场所与字符串相关的编程问题,java,Java,我有一个基于分隔符“(双引号)搜索的字符串 因此,当我输入字符串“program”时,它能够根据分隔符搜索字符串的开头和结尾,并返回我放入向量中的字符串程序 现在,如果我输入一个字符串“program”123”“,它将返回子字符串,如program,123,123 现在我想要的结果是程序“123”,根据用例,它是一个有效的字符串,但它包含“,作为字符串的一部分,这就是按分隔符搜索无法区分字符串开头和结尾的地方 有人能帮我解释一下逻辑吗 下面是我正在使用的方法 enter code here 公

我有一个基于分隔符
(双引号)搜索的字符串

因此,当我输入字符串
“program”
时,它能够根据分隔符搜索字符串的开头和结尾,并返回我放入向量中的字符串程序

现在,如果我输入一个字符串
“program”123”“
,它将返回子字符串,如
program
123
123

现在我想要的结果是
程序“123”
,根据用例,它是一个有效的字符串,但它包含
,作为字符串的一部分,这就是按分隔符搜索无法区分字符串开头和结尾的地方

有人能帮我解释一下逻辑吗

下面是我正在使用的方法

enter code here
公共静态PVector标记输入(最终字符串sCmd) 抛出ExceptionOpenQuotedString { 如果(sCmd==null) { 返回null; }

    PVector rc = new PVector();

    if (sCmd.length() == 0)
    {
        rc.add(StringTable.STRING_EMPTY);
        return rc;
    }

    char chCurrent = '\0';
    boolean bInWhitespace = true;
    boolean bInQuotedToken = false;
    boolean bDelim;
    int start = 0;
    int nLength = sCmd.length();

    for (int i = 0; i < nLength; i++)
    {
        chCurrent = sCmd.charAt(i); // "abcd "ef"" rtns abdc ef ef"
        bDelim = -1 != APIParseConstants.CMD_LINE_DELIMS.indexOf(chCurrent);

        if (bInWhitespace) // true
        {
            // In whitespace
            if (bDelim)
            {
                if ('\"' == chCurrent)
                {
                    start = i + 1;
                    bInQuotedToken = true;
                    bInWhitespace = false;
                } // if ('\"' == chCurrent)
            }
            else
            {
                start = i;
                bInWhitespace = false;
            } // else - if (bDelim)
        }
        else
        {
            // Not in whitespace
            boolean bAtEnd = i + 1 == nLength;
            if (!bDelim)
            {
                continue;
            }
            else
            {
                if ('\"' == chCurrent)
                {
                    if (!bInQuotedToken)
                    {
                        // ending current token due to '"'
                        if (bAtEnd)
                        {
                            // non terminated quoted string at end...
                            throw new ExceptionOpenQuotedString(
                                    sCmd.substring(start));
                        }
                        else
                        {
                            rc.add(sCmd.substring(start, i)); // include quote
                            bInQuotedToken = true;
                            bInWhitespace = false;
                        } // if (bAtEnd)
                    }
                    else
                    {
                        // ending quoted string
                        //if (!bAtEnd)
                        {
                            rc.add(sCmd.substring(start, i)); // don't include quote
                            bInQuotedToken = false;
                            bInWhitespace = true;
                        } // if (bAtEnd)
                    } // else - if (!bInQuotedToken)
                }
                else
                {
                    // got delim (not '"')
                    if (!bAtEnd && !bInQuotedToken)
                    {
                        rc.add(sCmd.substring(start, i));
                        bInWhitespace = true;
                    } // if (bAtEnd)
                } // else - if ('\"' == chCurrent)
            } // else - if (!bDelim)
        } // else - if (bInWhitespace)
    } // for (short i = 0; i < nLength; i++)

    if (!bInWhitespace && start < nLength)
    {
        if (!bInQuotedToken || chCurrent == '"')
        {
            rc.add(sCmd.substring(start));
        }
        else
        {
            throw new ExceptionOpenQuotedString(sCmd.substring(start));
        } // else - if (!bInQuotedToken)
    } // if (!bInWhitespace && start < nLength)
    return rc;
}
PVector rc=new PVector();
如果(sCmd.length()==0)
{
rc.add(StringTable.STRING_为空);
返回rc;
}
char chCurrent='\0';
布尔二进制空格=真;
布尔值bInQuotedToken=false;
布尔bDelim;
int start=0;
int nLength=sCmd.length();
对于(int i=0;i
您应该跳出“内部”。
否则,您可以检查第一个和最后一个“字符的位置,并使用这些位置作为分隔符拆分/剪切字符串。

您应该转义内部”。
否则,您可以检查“第一个”和“最后一个”字符的位置,并使用这些位置作为分隔符拆分/剪切字符串。

每当您将一种编码(所有可能的字符串)嵌入另一种编码(带引号的字符串)时,只有一些基本技术允许您明确地解析它们:

  • 不允许某些输入。例如,不允许引号字符。现在您知道它们始终是分隔符。在您的情况下,您可以在引号之外选择一个新的分隔符,并在输入中不允许该分隔符。这很少是可取的,因为您经常希望允许以前认为不需要的输入

  • 在编码中包含输入的长度。例如,可以在每个字符串前面加上字符数,而不是引号

  • 转义。某些输入无法直接表示。相反,至少保留一个字符作为转义字符。这表示后面的任何字符都应以不同的方式进行解释。在Java字符串中,反斜杠是转义字符。如果您仅出于一个原因需要转义字符,则可能需要使用t在SQL中,引号是字符串的引号字符,因此要在字符串中包含文字引号字符,需要键入两个引号


  • 每当你将一个编码(所有可能的字符串)嵌入到另一个(引用字符串)中时,只有几个基本的技术允许你使用PAR。