使用regex从url中提取查询字符串值

时间:2009-08-04 01:41:33

标签: regex

如果该变量不存在,我需要从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 个答案:

答案 0 :(得分:3)

你可以试试这个:

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

如果有参数且第一个参数名为“foo”,则其值将在组#1中捕获。如果没有参数,正则表达式仍然会成功,但我无法预测访问捕获组时会发生什么。一些可能性:

  • 它将包含一个空字符串
  • 它将包含一个空引用,它将自动转换为
    • 一个空字符串
    • “null”一词
  • 您的应用会抛出异常,因为第1组没有参加比赛。

此正则表达式匹配您提供的示例字符串,但如果参数列表不包含“foo”,或者“foo”不是第一个参数,则它将无法工作。假设捕获组的工作正常,那么这些选项也可以适应。

答案 1 :(得分:1)

我认为你需要做一场比赛,然后是正则表达式。这样,您可以提取值(如果存在),如果不存在则替换为“”。像这样:

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

我没有测试过正则表达式,所以我不知道它是否会起作用。

答案 2 :(得分:0)

在perl中你可以使用它:

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

这将使一切顺利吗?开始,然后隔离foo,抓住一组中的数字,让其余的数据掉落到可能的位置。

答案 3 :(得分:0)

使用正则表达式时有一个重要的规则:不要试图对其进行不必要的处理。有时,只有使用一个正则表达式才能完成任务。有时建议使用宿主编程语言。

马吕斯的回答是利用这个规则:而不是找到一种复杂的替换方式 - 只有它存在的东西,最好用你的编程语言来检查模式的存在,并且只有在必要。