powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с регуляркой
19 сообщений из 19, страница 1 из 1
Помогите с регуляркой
    #39601276
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!
Кто знает регулярки хелп плиз!
есть строка типа вот этой:

Код: plsql
1.
2.
where 1=1
   and t.segment4 IN (&p_segment4)



Параметр &p_segment4 идет из проги моей. Там типа лист. Так вот если параметра нет, т.е. p_segment4 == null,
то я подставлю в IN(t.segment4) в итоге получится валидный sql
Код: sql
1.
t.segment4 IN (t.segment4)

.

Проблема в том, что мне надо выдрать этот самый t.segment4. я так понял нужна регулярный шаблон типа where|and * IN (&p_segment4).
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601286
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте API для создания динамических SQL запросов (jOOQ, QueryDSL и т.п.). Регулярные выражения в этой задаче как козе баян. Одни неловкий рефакторинг и оно уже не работает.
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601333
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

Код: java
1.
2.
3.
4.
5.
6.
StringBuilder sql = new StringBuilder("where 1=1 and ");
if (p_segment4 == null) {
   sql.append("t.segment4 IN (t.segment4)");
} else {
   sql.append("t.segment4 IN (&p_segment4)");
}
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601348
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman,

Да вот есть у меня уже собранный запрос и мне надо на оборот в нем расковырять
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601352
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
StringBuilder sql = new StringBuilder("where 1=1 and t.segment4 IN  (").append(p_segment4 == null,"t.","&p_").append("segment4)");
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601357
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVUsman,

Да вот есть у меня уже собранный запрос и мне надо на оборот в нем расковырять
Нет, не надо. Но уж если совсем невмоготу, то
https://www.google.com/search?q=java sql parser
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601360
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
5.
String запрос=" and t.segment4 IN (&p_segment4)";

if (p_segment4 == null) {
запрос=запрос.replace("&s_","t.");
}
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601383
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вадя,

))) я все больше понимая, что форум это как комп, че на вход подал, то и получи.

Дело в том что &p_segment4 может быть и не &p_segment4, а например &p_seg4.
Мне известно только 2 вещи:
1. запрос
2. переменная &p_segment4

что там в самом запросе я х.з., но я точно знаю что там есть выражение с IN где присутствует переменная.
То что мне предлагают предикаты всякие или парсеры за это конечно спасибо, но задача локальная, одноразовая и из нее не надо раздувать чуть ли не целую ветку с проектом. Я всего лишь хотел узнать шаблон регулярки для этого примера. Если не найду, значит придется в циклах херачить.
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601404
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

Вот же зануда. :) Ну, тогда объясни как именно хочется искать и заменять. Потому что с одной стороны
AndronovMVнужна регулярный шаблон типа where|and * IN (&p_segment4).
AndronovMVДело в том что &p_segment4 может быть и не &p_segment4, а например &p_seg4.
А потом опять
AndronovMVпеременная &p_segment4

Я правильно понимаю, что хочется по имени переменной вытащить всё что перед IN без пробелов и вставить его вместо переменной?
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601406
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,
а кто мешает заменить &p_ на &p_segment4 в реплайсе
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601410
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

))

>>Я правильно понимаю, что хочется по имени переменной вытащить всё что перед IN без пробелов и вставить его вместо переменной?
Ну не прям все, а от where или and до переменной. А так да!
Короче выражение может быть как:
Код: sql
1.
and t.segment4 IN (&p_segment4)


так и:
Код: sql
1.
where t.segment4 IN (&p_segment4)



Мне нужно вытащить t.segment4, т.е. от команды where || and до IN в которой лежит переменная
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601415
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
вот этот костыль, к которому мне придется прибегнуть если не найду более изящного решения:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
public static String getFieldBeforeIN(String sql, String p) {
        String firstWord = "and";
        int a = 0;
        int b = sql.indexOf(p);
        for(int i = b; i>=0; i--) {
            if(sql.substring(i, b).toLowerCase().startsWith(firstWord.toLowerCase())) {
                a = i;
                break ;
            }
        }
        if(a <= sql.toLowerCase().indexOf("where")) {
            firstWord = "where";
            for(int i = b; i>=0; i--) {
                if(sql.substring(i, b).toLowerCase().startsWith(firstWord.toLowerCase())) {
                    a = i;
                    break ;
                }
            }
        }
        return StringUtils.substringBetween(sql.substring(a+firstWord.length(), b).trim(),""," ");
    }
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601416
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMV,

Так не важно что там AND, WHERE или JOIN, просто от пробела до пробела.
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601418
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,
так у меня пробелов может быть и до IN и после. Он их и захватит
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601430
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вытащить довольно просто, если это слово вообще применимо к регулярным выражениям:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
        String query = "where 1=1\n" +
            "   and t.segment4 IN (&p_segment4)";
        String variable = "&p_segment4";


        Pattern extractRegexp = Pattern.compile("(\\S+)\\s+IN\\s+\\(\\s*" + variable + "\\s*\\)", Pattern.CASE_INSENSITIVE);
        Matcher matcher = extractRegexp.matcher(query);
        if(matcher.find()){
            String replacement = matcher.group(1);
            System.out.println(replacement);
        }


А вот с заменой сложнее. lookbehind не разрешает повторы. Если есть уверенность, что переменная больше нигде не используется, то тогда String.replace(), а вот если нужно заменить только те вхождения, где переменная внутри IN, то уже надо подумать.
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601448
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Воо.. спасибо дорогой! Дальше я сам)
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601450
AndronovMV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz,

Слухай а как тут добавить еще и вариант с NOT IN ? ))
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601451
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Помогите с регуляркой
    #39601659
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndronovMVBlazkowicz,

Слухай а как тут добавить еще и вариант с NOT IN ? ))

Код: java
1.
"(\\S+)\\s+(?:NOT\\s+)?+IN\\s+\\(\\s*" + variable + "\\s*\\)"
...
Рейтинг: 0 / 0
19 сообщений из 19, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Помогите с регуляркой
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]