正则表达式模式匹配网址列表中的特定uri

时间:2013-05-07 14:50:06

标签: java

我有一个带有外卡的网址列表(lMapValues),如下面的代码所示 我需要将uri与此列表进行匹配才能找到匹配的URL。

在下面的代码中,我应该在地图m中获得匹配的url作为d的值。 这意味着如果uri的一部分在URL列表中匹配,则应该选择该特定URL。

我尝试在令牌中拆分uri,然后检查列表lMapValues中的每个令牌。但是它没有给我正确的结果。下面是代码。

public class Matcher
{
    public static void main( String[] args )
    {
        Map m = new HashMap();
        m.put("a","https:/abc/eRControl/*");
        m.put("b","https://abc/xyz/*");
        m.put("c","https://work/Mypage/*");
        m.put("d","https://cr/eRControl/*");
        m.put("e","https://custom/MyApp/*");

        List lMapValues = new ArrayList(m.values());
        List tokens = new ArrayList();

        String uri = "cr/eRControl/work/custom.jsp";

        StringTokenizer st = new StringTokenizer(uri,"/");
        while(st.hasMoreTokens()) {

            String token = st.nextToken();
            tokens.add(token);
        }

        for(int i=0;i<lMapValues.size();i++) {
            String value = (String)lMapValues.get(i);
            String patternString = "\\b(" + StringUtils.join(tokens, "|") + ")\\b";
            Pattern pattern = Pattern.compile(patternString);
            java.util.regex.Matcher matcher = pattern.matcher(value);

            while (matcher.find()) {
                System.out.println(matcher.group(1));
                System.out.println(value);
            }
        }
    }
}

请帮我用正则表达式来实现上述目标。 任何帮助将不胜感激。

3 个答案:

答案 0 :(得分:0)

问题在于i充当关键而不是

的索引
String value = (String)lMapValues.get(i);

您可以更好地交换地图以获取列表,并使用for for each循环。

List<String> patterns = new ArrayList<String>();
...
for (String pattern : patterns) {
  ....
}

答案 1 :(得分:0)

检查字符串是否以String.indexOf()的特定值开头更简单。

String[] urls = {
    "abc/eRControl", 
    "abc/xyz",
    "work/Mypage",
    "cr/eRControl",
    "custom/MyApp"
};

String uri = "cr/eRControl/work/custom.jsp";

for (String url : urls) {
    if (uri.indexOf(url) == 0) {
        System.out.println("Matched: " + url);
    }else{
        System.out.println("Not matched: " + url);
    }
}

另外。如果您永远不会与之匹配,则无需将方案存储到地图中。

答案 2 :(得分:0)

如果我正确理解了您的目标,您可能甚至不需要正则表达式。

试试这个......

package test;

import java.util.HashSet;
import java.util.Set;

public class PartialURLMapper {

    private static final Set<String> PARTIAL_URLS = new HashSet<String>();
    static {
        PARTIAL_URLS.add("cr/eRControl");
        // TODO add more partial Strings to check against input
    }
    public static String getPartialStringIfMatching(final String input) {
        if (input != null && !input.isEmpty()) {
            for (String partial: PARTIAL_URLS) {
                // this will be case-sensitive
                if (input.contains(partial)) {
                    return partial;
                }
            }
        }
        // no partial match found, we return an empty String
        return "";
    }
    // main method just to add example
    public static void main(String[] args) {
        System.out.println(PartialURLMapper.getPartialStringIfMatching("cr/eRControl/work/custom.jsp"));
    }

}

......它将返回:

cr/eRControl