2015-04-14 65 views
1

我正在寫一個非常小的SQL編輯器,主要是爲了獲得新穎性。 我現在可以執行所有的語句,只需要用分號分割整個文本,然後再運行一個語句。從字符串中提取最接近的句子

但是,我希望實現一個功能,我只運行最接近光標的語句,但我很難做到這一點。 我一直在尋找BreakIterator這似乎很有用,但它並沒有真正幫助我得到我需要的聲明。

這些是我需要支持的情況: 遊標位於|

  1. SELECT * FROM something;|光標放置分號
  2. SELECT * FROM so|mething;光標置於聲明
  3. SELECT * FROM something\nLEFT |JOIN foo USING (bar);聲明跨越幾個行內後,再次用光標放置在兩個分號之後,或者在語句中。

任何想法爲此簡單的解決方案?

+0

您使用的小程序或一些文本編輯爲接受用戶輸入 http://stackoverflow.com/questions/4565836/how-to-find-cursor-position-in-a-jtextarea 這個鏈接可以讓你知道光標的位置,你可以從這一點獲得下一個查詢片段, –

+0

不,我正在寫入一個修改後的JTextArea。我可以使用getCaretPosition()獲取光標位置,但我不確定如何覆蓋所有我以乾淨的方式提到的情況。 – Istarnion

回答

1

你可以試試這個:

// assuming the editorText is the contents of the edit window 
String[] statements = editorText.split(";"); 

int statementCharactersProcessed = 0; 

// assuming caret is at position caretIndex 

int statementIndex = 0; 
String statement; 
while (caretIndex>statementCharactersProcessed+1) { 
    // re-add the missing ; 
    statement = statements[statementIndex++] + ";"; 
    statementCharactersProcessed += statement.length; 
} 

// statement should now be the value you're looking for 
+0

完美!唯一缺乏的是最後聲明中的'.trim()'。 – Istarnion

+0

這個算法可能還有一些其他的皺紋......但這不是一個糟糕的開始! –

1

我認爲你想要的邏輯運行光標範圍內的所有語句。

「光標的範圍」我的意思是:所有之間的分號,直到下一個分號,從光標所在行的起始位置開始(所以如果光標位於分號後面 - 轉到行首並且應用此邏輯)

+0

這確實是我想要的,但也是光標位於最後一個分號後的轉角情況。這實際上是一個非常常見的情況,當你編寫這個語句時,你完成了分號,所以現在它的後面會有脫字符號。 – Istarnion

+0

是的,我更新了答案 - 它回答了這個問題嗎? – Mzf

+0

關閉。只有麻煩是第三種情況,有多行陳述,但由於同樣的邏輯適用,我會接受你的答案。 我希望有一種比從光標來回掃描我的方式更簡單的方法,但是哦。 我會看看我是否不能使用'indexOf()'來查找我的位置。 – Istarnion

0

我硝基甲苯知道要實現它,但我可以建議你,如果你能之前和光標位置後檢查分號。並執行落在這些分號之間的語句應該可以幫助我感受。

:)

相關問題