1

"区切り文字(二重引用符)に基づいて検索される文字列があります。

そのため、文字列を入力する"program"と、区切り文字に基づいて文字列の最初と最後を検索し、ベクトルに入れた文字列プログラムを返すことができます。

ここで、文字列を入力すると、 、、"program"123""などの部分文字列が返されます。program123123"

今私が望む結果はprogram"123"、ユースケースごとに有効な文字列ですが"、文字列の一部として含まれています。これは、区切り文字による検索が文字列の先頭と末尾を区別できない場所です。

誰かがいくつかのロジックを助けることができますか?

以下は私が使用している方法です。

enter code here

public static PVector tokenizeInput(final String sCmd) throws ExceptionOpenQuotedString { if (sCmd == null) { return 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;
}
4

2 に答える 2

1

内部の " をエスケープする必要があります。それ以外の場合は、最初と最後の " 文字の位置を確認し、それらの位置を区切り記号として使用して文字列を分割/カットできます。

于 2012-06-26T10:58:55.967 に答える
0

あるエンコーディング (考えられるすべての文字列) を別のエンコーディング (引用符で囲まれた文字列) に埋め込むときはいつでも、それらを明確に解析できるようにするための基本的なテクニックがいくつかあります。

  1. 特定の入力を禁止します。たとえば、引用符は使用できません。これで、それらが常に区切り文字であることがわかりました。あなたの場合、引用符以外の新しい区切り文字を選択して、入力でそれを禁止することができます。以前は必要ないと思っていた入力を許可したくなることがよくあるため、これが望ましいことはめったにありません。

  2. 入力の長さをエンコードに含めます。たとえば、引用符の代わりに、各文字列の前に文字数を指定できます。

  3. 逃げる。一部の入力は直接表すことができません。代わりに、少なくとも 1 文字がエスケープ文字として予約されています。それに続くものは、別の方法で解釈する必要があることを示します。Java 文字列では、円記号はエスケープ文字です。エスケープ文字が必要な理由が 1 つだけの場合は、いくつかの SQL ダイアレクトの例に従って、それを 2 倍にしたい場合があります。SQL では、引用符は文字列の引用符であるため、文字列にリテラルの引用符を含めるには、2 つの引用符を入力します。

于 2012-06-26T11:14:09.033 に答える