2012-06-26 23 views
1

我有一個字符串,它是根據分隔符"(雙引號)進行搜索的。與字符串有關的工作地點編程問題

所以當我輸入字符串"program"時,它能夠根據分隔符搜索字符串的開始和結尾,並返回我放入向量中的字符串程序。

現在,如果我輸入字符串"program"123"",它會返回像我這樣的子字符串,如program,123,123"

現在的結果我想是program"123"這是一個有效的字符串作爲每一個用例,但它包含"作爲字符串的一部分,這就是由分隔符搜索失敗字符串的開頭和結尾來區分。

有人可以幫助一些邏輯?

以下是我正在使用的方法。

enter code here 

公共靜態PVector tokenizeInput(最後絃樂SCMD) 拋出ExceptionOpenQuotedString { 如果(SCMD == 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; 
} 
+0

如何區分雙引號作爲分隔符和字符串的一部分?我不是在要求你的代碼,而是在純英文的規則。 –

+0

你真的應該向我們展示你在字符串中讀取的代碼並標記它。 – Wernsey

+0

正則表達式是你的朋友。 – mah

回答

1

你應該逃逸的內部「 否則,你可以檢查的第一個和最後的位置」字符和分流/切割上述位置作爲分隔符的字符串。

0

每當你嵌入另一個(被引用的字符串)內的一個編碼(所有可能的字符串)只有一些基本的技巧,讓你明確地解析他們:

  1. 禁止某些輸入。例如,不要允許引號字符。現在你知道他們總是分隔符。在你的情況下,你可以選擇一個除引號外的新分隔符,並在你的輸入中禁止這個分隔符。這是很不可取的,因爲你最終希望允許你以前認爲你不需要的輸入。

  2. 在編碼中包含輸入的長度。例如,您可以在每個字符串前加上引號,而不是引號中的字符數。

  3. 逃跑。一些輸入不能直接表示。相反,至少有一個字符被保留爲轉義字符。它表明,無論如何它應該以不同的方式解釋。在Java字符串中,反斜線是轉義字符。如果您因爲單一原因只需要轉義字符,那麼您可能希望遵循一些SQL方言的示例並將其加倍。在SQL中,引號是字符串的引號字符,因此要在字符串中包含引號字符,可以鍵入兩個引號。