Java 如何根据以下字符/单词匹配URI字符串的特定部分
我试图只在URI的特定部分后面没有任何东西,或者后面跟“?”时匹配它Java 如何根据以下字符/单词匹配URI字符串的特定部分,java,string,pattern-matching,Java,String,Pattern Matching,我试图只在URI的特定部分后面没有任何东西,或者后面跟“?”时匹配它 .../survey?expand=all //should match .../survey //should match .../survey/.. //should not match 我找不到一种方式来实现这一点。我尝试了(?=.*调查(?!\\?),但没有成功。我也找不到一种方法,用两种不同的模式来做。例如,我想匹配../survey而不是../su
.../survey?expand=all //should match
.../survey //should match
.../survey/.. //should not match
我找不到一种方式来实现这一点。我尝试了(?=.*调查(?!\\?)
,但没有成功。我也找不到一种方法,用两种不同的模式来做。例如,我想匹配../survey
而不是../survey/…
,但是这个*?/survey\\b
对我不起作用
我的解析器:
public class UriParser {
private static String reqUriPath = null;
private static String pattern = null;
public static Boolean isURIMatching(Object routePattern, String pattern){
reqUriPath = routePattern.toString();
return checkPattern(reqUriPath, pattern);
}
private static Boolean checkPattern(String reqUriPath, String pattern) {
Pattern p = Pattern.compile(pattern,Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher(reqUriPath);
return m.find();
}
}
公共类语法分析器{
私有静态字符串REQUIRIPATH=null;
私有静态字符串模式=null;
公共静态布尔值isURIMatching(对象路由模式、字符串模式){
reqUriPath=routePattern.toString();
返回checkPattern(请求路径、模式);
}
私有静态布尔检查模式(字符串请求路径,字符串模式){
Pattern p=Pattern.compile(Pattern,Pattern.CASE\u不区分大小写);
匹配器m=p.Matcher(请求路径);
返回m.find();
}
}
我已经用更好的答案更新了我的正则表达式
\\/survey(?(?=\\?)\\S*|$)
说明:
这里(?(?=\\?)\\S*\$)
基本上是一个If子句,即(?=\\?)-->If(contains?
else |$,所以我们有以下条件:-1.
?=
即\\?-->代码>即文字,那如果呢?在字符串中找到,然后允许\S*任何非空白
2.|
是Else条件,即字符串必须在那里结束,因此不可能再匹配/了
如果您对解释感到困惑,可以查看下面的regex 101链接,该链接包含关于regex的coll解释以及所有描述
我试图只在URI的特定部分后面没有任何东西,或者后面跟“?”时匹配它
您可以在没有正则表达式的情况下执行此操作
public class UriParser {
public static void main(String []args){
System.out.println(isURIMatching("http://test.com/survey?expand=all", "survey"));
System.out.println(isURIMatching("http://test.com/survey", "survey"));
System.out.println(isURIMatching("http://test.com/survey/anything", "survey"));
}
public static Boolean isURIMatching(Object routePattern, String pattern){
final String reqUriPath = routePattern.toString();
final int lastIndex = reqUriPath.lastIndexOf(pattern);
final String lastPart = reqUriPath.substring(lastIndex+pattern.length()).trim();
return "".equals(lastPart) || lastPart.startsWith("?");
}
}
是的,它有效。你能进一步解释一下你是如何做到这一点的吗:在“sruvey”之后,如果“if”?“或者什么都不匹配,那么匹配,否则不匹配。换句话说,你是怎么做的optional@Hawk如果你觉得这样,也请接受答案。