Замена слова в зависимости от предыдущего и следующего слова в файле с использованием java

avatar
Pankaj Rathi
8 апреля 2018 в 09:47
79
1
1

У меня есть файл SQL, в котором я хочу заменить слово чем-то другим. Но загвоздка здесь в том, что я бы заменил слово в зависимости от появления двух предыдущих слов и следующего слова.

Например, если файл SQL содержит "INSERT INTO table_name VALUES", я просто хочу добавить квадратную скобку к имени таблицы и сделать его заглавным.

поэтому после изменений будет "INSERT INTO [TABLE_NAME] VALUES".

Я пытался использовать FileInputStream и FileOutputStream, но обнаружил, что в моем случае это может быть неэффективно. В файле много операторов INSERT.

Пожалуйста, предложите какую-нибудь эффективную идею для этого.

Источник
Tim Biegeleisen
8 апреля 2018 в 09:52
0

Что еще вам нужно заменить, кроме этого единственного примера?

Seelenvirtuose
8 апреля 2018 в 09:54
0

Может быть, вы хотите использовать регулярное выражение: String.replaceAll?

YCF_L
8 апреля 2018 в 10:14
0

@Seelenvirtuose вы не можете использовать верхний регистр имени таблицы с replaceAll :)

Tim Biegeleisen
8 апреля 2018 в 10:22
0

Могу я спросить, почему вы хотите заключить имя таблицы в скобки? Он уже должен работать на SQL Server AFAIK.

Pankaj Rathi
12 апреля 2018 в 10:07
0

Спасибо за помощь ребята. У меня другое сомнение. В MySQL для возврата каретки и разрыва строки мы используем '\r\n'. Что же мы используем в MS SQL.

Ответы (1)

avatar
YCF_L
8 апреля 2018 в 09:56
1

Вы можете использовать Pattern с этим регулярным выражением (.*?\s+.*?\s+)(.*?)(\s.*) или ((.*?\\s+){2})(.*?)(\\s.*) следующим образом

String query = "INSERT INTO table_name VALUES";

Pattern pattern = Pattern.compile("(.*?\\s+.*?\\s+)(.*?)(\\s.*)");
Matcher matcher = pattern.matcher(query);
while (matcher.find()) {
    query = matcher.group(1) + 
            String.format("[%s]", matcher.group(2).toUpperCase()) + 
            matcher.group(3);
}

System.out.println(query);

Вывод

INSERT INTO [TABLE_NAME] VALUES

детали:

  1. (.*?\s+.*?\s+) соответствует двум первым словам
  2. (.*?) соответствует имени таблицы
  3. (\s.*)
YCF_L
8 апреля 2018 в 10:01
0

Что ты имел в виду @TimBiegeleisen?

Tim Biegeleisen
8 апреля 2018 в 10:42
0

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

YCF_L
8 апреля 2018 в 10:43
0

Можете ли вы предложить другой шаблон @TimBiegeleisen, вы лучше меня в этом :)

Tim Biegeleisen
8 апреля 2018 в 10:44
0

Шаблон, который я использовал, кажется мне подходящим, по крайней мере, для этой конкретной замены. Но я излил себя, дав ответ replaceAll, в котором мы не можем изменить случай.

Pankaj Rathi
12 апреля 2018 в 10:07
0

Спасибо за помощь ребята. У меня другое сомнение. В MySQL для возврата каретки и разрыва строки мы используем \r\n. Что же мы используем в MS SQL.

YCF_L
12 апреля 2018 в 10:10
0

@PankajRathi, пожалуйста, задайте еще один вопрос, я уверен, что мы вам ответим :)