Как сопоставить определенную часть строки URI на основе следующих символов / слов - PullRequest
0 голосов
/ 18 мая 2019

Я пытаюсь сопоставить определенную часть URI только тогда, когда за ней ничего не следует, или когда за ней следует '?'.

.../survey?expand=all  //should match    
.../survey             //should match   
.../survey/..          //should not match    

Я не мог найти способ сделать это в одном паттерне. Я пытался (?=.*survey(?!\\?)) и не работал. Я также не мог найти способ сделать это в двух отдельных шаблонах. Например, я хочу соответствовать .../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();
    }

}

Ответы [ 2 ]

1 голос
/ 18 мая 2019

Я обновил свое регулярное выражение с лучшим ответом

\\/survey(?(?=\\?)\\S*|$)

Объяснение:

Здесь (?(?=\\?)\\S*|$), по сути, является предложением If, т.е. (?=\\?) --> if(contains ?) else | $, поэтому мы имеем следующее условие: -
1. ?=<condition> то есть \\? --> ? то есть буквально? , так что если ? находится в строке, затем разрешите \ S * любое не белое пространство.
2. | - это условие Else, т. Е. Иначе строка должна заканчиваться там, следовательно, нет шансов на совпадение / дальнейшее.


Если вас смущает объяснение, вы можете проверить ссылку ниже для регулярного выражения 101, в котором есть подробное объяснение регулярного выражения со всем описанием
https://regex101.com/r/WCt3WB/2

0 голосов
/ 18 мая 2019

Я пытаюсь сопоставить определенную часть 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("?");
    }
}
...