我有一个带有外卡的网址列表(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);
}
}
}
}
请帮我用正则表达式来实现上述目标。 任何帮助将不胜感激。
答案 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