2015-04-14 2 views
1

Я пишу очень маленький редактор SQL, в основном для новинок. Теперь я могу выполнить все утверждения, просто разделив весь текст на точки с запятой и запустив одно утверждение за другим.Извлечение ближайшего предложения из строки

Однако я хочу реализовать функцию, в которой я запускаю только оператор, ближайший к курсору, но я не понимаю, как это сделать. Я смотрел на BreakIterator, который кажется полезным, но на самом деле это не помогает мне получить требуемое утверждение.

Это те случаи, которые мне нужно поддерживать: Курсор расположен на |

  1. SELECT * FROM something;| Курсор помещается после запятой
  2. SELECT * FROM so|mething; Курсор помещается в отчете
  3. SELECT * FROM something\nLEFT |JOIN foo USING (bar); заявление, охватывающих несколько строк, опять-таки с помощью курсора помещенного как после запятой, или в заявлении.

Любые идеи для простого решения для этого?

+0

Вы используете апплет или некоторые TextEditor для приема пользовательского ввода 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

я ДНТ знаю, чтобы реализовать его, но я могу предложить вам, если вы можете проверить точку с запятой до и после позиции курсора. и выполнить заявление, которое находится между этими точками с запятой, должно помочь вам почувствовать.

:)

Смежные вопросы