Извлечение значения строки запроса из URL с помощью регулярного выражения - PullRequest
2 голосов
/ 04 августа 2009

Мне нужно вытащить переменную из URL или получить пустую строку, если эта переменная отсутствует.

Псевдокод:

String foo = "http://abcdefg.hij.klmnop.com/a/b/c.file?foo=123&zoo=panda";
String bar = "http://abcdefg.hij.klmnop.com/a/b/c.file";

когда я запускаю свое регулярное выражение, я хочу получить 123 в первом случае и пустую строку во втором.

Я пытаюсь это заменить вместо меня .*?foo=(.*?)&?.* заменив это на $1, но это не работает, когда foo = нет.

Я не могу просто сделать матч, это должна быть замена.

Ответы [ 4 ]

3 голосов
/ 04 августа 2009

Вы можете попробовать это:

[^?]+(?:\?foo=([^&]+).*)?

Если есть параметры и первый параметр называется «foo», его значение будет зафиксировано в группе # 1. Если параметров нет, регулярное выражение все равно будет успешным, но я не могу предсказать, что произойдет, когда вы получите доступ к группе захвата. Некоторые возможности:

  • будет содержать пустую строку
  • будет содержать нулевую ссылку, которая будет автоматически преобразована в
    • пустая строка
    • слово "ноль"
  • ваше приложение выдаст исключение, потому что группа № 1 не участвовала в матче.

Это регулярное выражение соответствует предоставленным вами образцам строк, но не будет работать, если есть список параметров, который не содержит «foo», или если «foo» не является первым параметром. Эти опции также могут быть адаптированы, при условии, что работает группа захвата.

1 голос
/ 04 августа 2009

Я думаю, вам нужно сделать совпадение, а затем регулярное выражение. Таким образом, вы можете извлечь значение, если оно присутствует, и заменить его на «», если его нет. Примерно так:

if(foo.match("\\?foo=([^&]+)")){
  String bar = foo.replace("\\?foo=([^&]+)", $1);
}else{
  String bar = "";
}

Я не проверял регулярное выражение, поэтому не знаю, сработает ли оно.

0 голосов
/ 04 августа 2009

При использовании регулярных выражений есть важное правило: не пытайтесь добавлять в него ненужную обработку. Иногда вещи не могут быть сделаны только с помощью одного регулярного выражения. Иногда целесообразнее использовать язык программирования хоста.

В ответе Мариуса используется это правило: вместо того, чтобы находить извилистый способ замены чего-то, только если он существует, лучше использовать язык программирования, чтобы проверить наличие шаблона, и заменять, только если необходимо.

0 голосов
/ 04 августа 2009

В Perl вы можете использовать это:

s/[^?*]*\??(foo=)?([\d]*).*/$2/

Это будет все до? чтобы начать, а затем изолировать foo, возьмите номера в группе и пусть остальные упадут, где они могут.

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