如何测试URL是否包含某些参数,而不是其他使用正则表达式的参数

时间:2016-05-23 20:54:08

标签: java android regex

我有这种格式的网址:

http://www.example.com/path?param1=value1&param2=value2

我需要一个正则表达式来匹配路径和params1和params2的任何顺序,但如果param3存在,那么我需要它失败所以:

String str1 = "/path?param1=value1&param2=value2"; // This will match
String str2 = "/path?param2=value2&param1=value1"; // This will match
String str3 = "/path?param1=value1&param2=value&param3=value3"; // This will not match

因为我尝试使用lookarounds来匹配参数,但它失败了:

/path\?(?!param3)(?=param1=.*)(?=param2=.*)

有什么想法吗?

Pd积。好奇的是,我正在尝试匹配AndroidManifest.xml文件中的特定网址https://developer.android.com/guide/topics/manifest/data-element.html

3 个答案:

答案 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是可选的。