2009-08-04 83 views
2

如果该变量不存在,我需要从URL中提取变量或获取空字符串。使用正则表达式从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 =不存在时这不起作用。

我不能只是做一个匹配,它必须是一个替代。

+0

哪种语言? – 2009-08-04 01:45:36

回答

3

你可以试试这个:

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

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

  • 它将包含一个空字符串
  • 它将包含空引用,这将被自动转换为
    • 空字符串
    • 单词“空”
  • 你的应用程序会抛出异常,因为组#1没有参加比赛。

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

1

我认为你需要做一个匹配,然后一个正则表达式。这样,你可以提取值,如果它存在,并替换为“”,如果它不是。这样的事情:

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

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

0

在Perl中,你可以这样做:

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

这将让一切都交给了?开始,然后隔离foo,抓住组中的数字,让剩下的部分落在可能的位置。

0

使用正则表达式时有一条重要规则:不要尝试将不必要的处理加入其中。有时候只能用一个正则表达式才能完成。有时使用主机编程语言更为明智。

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

相关问题