Java 如何根据以下字符/单词匹配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

我试图只在URI的特定部分后面没有任何东西,或者后面跟“?”时匹配它

.../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如果你觉得这样,也请接受答案。