регулярное выражение и экранирование - PullRequest
0 голосов
/ 15 марта 2010

Извините, если это было запрошено, мой поиск вызвал много не по теме сообщений.

Я пытаюсь преобразовать символы подстановки из пользовательской строки поиска (подстановочный знак "*") в PostgreSQL как подстановочный знак "% ".

Я бы хотел обработать экранирование, чтобы "%" => "\%" и "\*" => "*"

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

String convertWildcard(String like)
{
    like = like.replaceAll("%", "\\%");
    like = like.replaceAll("\\*", "%");
    return like;
}

Assert.assertEquals("%", convertWildcard("*"));
Assert.assertEquals("\\%", convertWildcard("%"));
Assert.assertEquals("*", convertWildcard("\\*")); // FAIL

Assert.assertEquals("a%b", convertWildcard("a*b"));
Assert.assertEquals("a\\%b", convertWildcard("a%b"));
Assert.assertEquals("a*b", convertWildcard("a\\*b")); // FAIL

Идеи приветствуются.

РЕДАКТИРОВАТЬ

Чтобы уточнить,

Я хочу метод, который делает 1 или более String.replaceAll вызовов для преобразования строки так, чтобы

  • экземпляры % становятся \%,
  • экземплярами * становятся % и
  • экземплярами \* становятся *.

Лучший ответ будет использовать наименьшее количество звонков на String.replaceAll.

Ответы [ 2 ]

1 голос
/ 15 марта 2010

Обратите внимание, что в некоторых тестах на утверждение вы не избежали обратной косой черты. См. Раздел «Регулярные выражения, буквенные строки и обратные слэши» в http://www.regular -expressions.info / java.html

1 голос
/ 15 марта 2010

Вам нужно то, что называется «Отрицательный взгляд назад». Чтобы выбрать все % без предшествующего \:

(?<!\\)% (выражение регулярного выражения)

чтобы использовать его в Java, нужно добавить маскировку:

string.replaceAll("(?<!\\\\)%", "*");

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...