Удаление квадратных скобок без кавычек из строкиJAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Удаление квадратных скобок без кавычек из строки

Сообщение Anonymous »

Что-то заставило меня задуматься сегодня: есть ли в этой строке регулярное выражение, соответствующее [ADD_CONDITION]

DELETE FROM Solution_vac.refuse_diseases WHERE ignore_id = 123 [ADD_CONDITION]

но в этой строке вообще ничего не соответствует

select regexp_replace('abc123', '[^[:digit:]]', '') из двойного

? Теперь позвольте мне описать мою проблему.
У нас есть строки SQL с заполнителями. Мы можем заменить их подзапросами, дополнительными полями и т. д. Иногда нам это не нужно. В этом случае нам нужно написать довольно подробный код для удаления этих заполнителей. Мне это не понравилось, поэтому я написал этот аккуратный метод (javadoc опущен):
private static String removePlaceholders(String sql) {
if (StringUtils.isEmpty(sql)) return null;
String placeholderPattern = "\\[.*]";
return sql.replaceAll(placeholderPattern, "");
}

Сегодня меня что-то смутило. Я думал, что все продумал. Мы не планируем переходить на БД Microsoft, где поддерживаются квадратные скобки, я так понял, все в порядке. Однако мой шаблон также соответствовал кавычкам. Поэтому важные части SQL-запросов также были удалены (см. пример выше).
Есть ли краткий способ убедиться, что удаляются только заполнители, а не квадратные скобки в кавычках? Если да, то как? Я думаю, что ключом является количество кавычек перед скобками (если оно нечетное, оставьте скобки в покое). Но я не смог придумать ни одного регулярного выражения, которое учитывало бы это.
Вы также можете писать код, если этого нельзя избежать, а не только регулярное выражение.
Также доступна Java 8. Apache Commons


commons-lang
commons-lang
2.6


import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

import java.sql.SQLException;

public class QueryTest {

@Test
void queryParserSquareBracketsAsPlaceholder() {
String sql = "DELETE FROM solution_vac.refuse_diseases\n" +
" WHERE refuse_id = 123\n" +
"[ADD_CONDITION]";

String expected = "DELETE FROM solution_vac.refuse_diseases\n" +
" WHERE refuse_id = 123";

assertQuery(expected, sql);
}

@Test
void queryParserSquareBracketsInLiteral() {
String sql = "select regexp_replace('abc123', '[^[:digit:]]', '') from dual";

String expected = sql;

assertQuery(expected, sql);
}

@ParameterizedTest
@CsvSource(value = {
"sql01 [TEST1][TEST2], sql01",
"sql02 [], sql02",
"[A1][A2] sql, sql",
"[A1] sql [A2] sql2 [A3], sql sql2",
"sql03 [ 'TEST'' ], sql03",
"sql04 /*[TEST*/ sql2 [TEST2], sql04 sql2",
"sql05 :ID '[TEST1]' [TEST2], sql05 NULL '[TEST1]'",
"sql06 [TEST1 sql2, sql06 [TEST1 sql2",
"sql07 'str [TEST1], sql07 'str"

})
void queryParserSquareBracketsSpecialCases(String input, String expectedOutput) {
assertQuery(expectedOutput, input);
}

private void assertQuery(String sqlExpected, String sqlInput) {
String sqlParsed = removePlaceholders(sqlInput);

Assertions.assertEquals(sqlExpected, sqlParsed);
}

private static String removePlaceholders(String sqlString) {
// your implementation's here...
}
}


Подробнее здесь: https://stackoverflow.com/questions/790 ... rom-string
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»