Что-то заставило меня задуматься сегодня: есть ли в этой строке регулярное выражение, соответствующее [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
Программисты JAVA общаются здесь
-
Anonymous
1728486145
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...
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/79070905/removing-unquoted-square-brackets-from-string[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия