Что-то заставило меня задуматься сегодня: есть ли в этой строке регулярное выражение, соответствующее [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
Удаление квадратных скобок без кавычек из строки ⇐ JAVA
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение