如果该变量不存在,我需要从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 :(得分:3)
你可以试试这个:
[^?]+(?:\?foo=([^&]+).*)?
如果有参数且第一个参数名为“foo”,则其值将在组#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)
使用正则表达式时有一个重要的规则:不要试图对其进行不必要的处理。有时,只有使用一个正则表达式才能完成任务。有时建议使用宿主编程语言。
马吕斯的回答是利用这个规则:而不是找到一种复杂的替换方式 - 只有它存在的东西,最好用你的编程语言来检查模式的存在,并且只有在必要。