我有这种格式的网址:
http://www.example.com/path?param1=value1¶m2=value2
我需要一个正则表达式来匹配路径和params1和params2的任何顺序,但如果param3存在,那么我需要它失败所以:
String str1 = "/path?param1=value1¶m2=value2"; // This will match
String str2 = "/path?param2=value2¶m1=value1"; // This will match
String str3 = "/path?param1=value1¶m2=value¶m3=value3"; // This will not match
因为我尝试使用lookarounds来匹配参数,但它失败了:
/path\?(?!param3)(?=param1=.*)(?=param2=.*)
有什么想法吗?
Pd积。好奇的是,我正在尝试匹配AndroidManifest.xml文件中的特定网址https://developer.android.com/guide/topics/manifest/data-element.html
答案 0 :(得分:2)
试试这个:
^(?!.*param3)(?=.*param1=)(?=.*param2=).*$
https://regex101.com/r/rI1lH5/1
如果你想要路径,那么
^\/path(?!.*param3)(?=.*param1=)(?=.*param2=).*$
答案 1 :(得分:0)
这开始是一个评论,我有点被带走了。您可以清理查询并查看它是否与您需要的参数匹配,并一起避免正则表达式(如果可能)
private boolean checkProperQueryString(String url, String[] requiredKeys){
try{
UrlQuerySanitizer sanitizer = new UrlQuerySanitizer(url);
// Check that you have the right number of parameters
List<UrlQuerySanitizer.ParameterValuePair> parameters =
sanitizer.getParameterList();
if(parameters == null || parameters.size() != requiredKeys.length)
return false;
// Check to make sure that the parameters you have are the
// correct ones
for(String key : requiredKeys){
if(TextUtils.isEmpty(sanitizer(getValue(key))
return false;
}
// We pass every test, success!
return true;
} catch(Exception e){
// Catch any errors (haven't tested this so not sure of errors)
e.printStackTrace();
return false;
}
}
然后你可以通过这样的方式进行调用
boolean validUrl = checkProperQueryString(url, new String[]{"param1", "param2"});
这并没有直接回答你的问题,而是评论过多:P
让我知道这是否会给任何人增加混乱,我可以删除它。
答案 2 :(得分:0)
Michael提供的正则表达式效果很好,但存在故障。它还评估newParam。因此,我们应该使用以下方式进行更改:
(?!.*(\\?|&)param3)(?=.*(\\?|&)param1=)(?=.*(\\?|&)param2=)?.*$
基本上,我们检查参数名称是否以?开头。要么 &。另外,如果您想将参数设为可选,则只需输入?即可。最后像:
/etc/logrotate.d/
在上面,param2是可选的。