Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Парсинг строки. Split  [new]
AndronovMV
Member

Откуда: Тольятти
Сообщений: 95
Привет!

У кого какие идеи есть, для реализации следующей задачи:

Есть строка
String line = "balance.find(WHERE is_active = 'Y'); commander.plsql(BEGIN...END;);";


Как видите в строке описаны некие команды разделенные точкой с запятой (;).
Тут 2 команды, который можно было бы разложить на 2 подстроки методом split.
String[] cmd = line.split(";");

Проблема в том, что во второй подстроке присутствуют тсз (;) для sql выражения которые соответственно не должны учитываться.

я предполагаю, что разделение должно происходить в соответствии с уровнем. т.е. в данном примере - на 1 уровне.

За 1 уровень можно считать строку не обрамленную скобками. Если парсер наткнулся на тсз (;) которые находятся внутри скобок, то разделение не производить.

Попытался объяснить как мог.

* тсз (;) - точкой с запятой

Спасибо, с наступающим!
31 дек 17, 16:26    [21076195]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
Usman
Member

Откуда: من ألماتي
Сообщений: 5599
AndronovMV
Проблема в том, что во второй подстроке присутствуют тсз (;)
только для этого кейса:
line.split("; ")
31 дек 17, 16:46    [21076210]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
вадя
Member

Откуда: Екатеринбург
Сообщений: 14446
String[] cmd = line.split("; ");

только надо ещё сделать
cmd[0]=cmd[0]+";"
31 дек 17, 16:49    [21076213]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
mayton
Member

Откуда: loopback
Сообщений: 37439
AndronovMV
Привет!

У кого какие идеи есть, для реализации следующей задачи:

Есть строка
String line = "balance.find(WHERE is_active = 'Y'); commander.plsql(BEGIN...END;);";


Тут изначально формат строки неоднозначен. Вот если был-бы escape-ing PLSQL тогда было-бы проще.

Например.

String line = "balance.find(\"WHERE is_active = 'Y'\"); commander.plsql(\"BEGIN...END;\");";

Мы-бы не трекали сплит по внутренним строковым литералам.
1 янв 18, 20:55    [21077594]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
Dmitry.
Member

Откуда: Киев
Сообщений: 797
если писать свой парсинг , то надо учитывать что символы ; ( ) могут быть внутри строки или комментариев.

вопрос - а что это за синтаксис? и зачем тебе его парсить?
2 янв 18, 00:20    [21077923]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
AndronovMV
Member

Откуда: Тольятти
Сообщений: 95
Привет всем, спасибо! Извиняюсь за позднее реагирование, НГ понимаете...))
mayton, Спасибо! Ну допустим я сделаю с эскейп-знаками, у тебя есть вариант как эту строку распарсить?
String line = "balance.find(\"WHERE is_active = 'Y'\"); commander.plsql(\"BEGIN...END;\");";


Dmitry., делаю дата-формы в свинге на основе xml где элементы биндятся с данными (датасоурсами). В данном примере balance - это датасоурс в котором есть данные и ими можно манипулировать. commander - хоть и обрабатывается как датасоурс, но им на самом деле не является. Это типа системного коммандреа который может делать какие-то действия на уровне контекста приложения.
3 янв 18, 12:34    [21079957]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
Usman
Member

Откуда: من ألماتي
Сообщений: 5599
AndronovMV,

Идеальный вариант - одна команда (вызов метода) на одну строку.

Другой вариант:
String line = "balance.find(\"WHERE is_active = 'Y'\");\ncommander.plsql(\"BEGIN...END;\");";
добавить управляющий символ LF (line feed) между командами (после тчкзпт) -
\n
3 янв 18, 12:43    [21079972]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
AndronovMV
Member

Откуда: Тольятти
Сообщений: 95
Usman,

Ну одна команда это конечно исключено, разделение переходами на новую строку как вариант, но оставлю его на закуску, хочу посмотреть как с эскейпами распарсить
3 янв 18, 13:22    [21080024]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
mayton
Member

Откуда: loopback
Сообщений: 37439
AndronovMV
Привет всем, спасибо! Извиняюсь за позднее реагирование, НГ понимаете...))
mayton, Спасибо! Ну допустим я сделаю с эскейп-знаками, у тебя есть вариант как эту строку распарсить?
String line = "balance.find(\"WHERE is_active = 'Y'\"); commander.plsql(\"BEGIN...END;\");";

Все просто, мой недоверчивый друг. Считаешь четные и нечетные кавычки. Если точка с запятой
стоит внутри такого литерала - то мы ее игнорируем. Она принадлежит PLSQL.
3 янв 18, 23:04    [21080846]     Ответить | Цитировать Сообщить модератору
 Re: Парсинг строки. Split  [new]
AndronovMV
Member

Откуда: Тольятти
Сообщений: 95
mayton,

ммм.. Спасибо, в теории понятно, ща попробую. Я просто думал что будут регулярки сложные =)
4 янв 18, 10:12    [21081261]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить