Регулярное выражение для сопоставления любого символа в разделителях в строке - PullRequest
1 голос
/ 27 апреля 2019

У меня есть строки в формате

/person/PATH_VARIABLE/address/PATH_VARIABLE
/person/PATH_VARIABLE/PATH_VARIABLE
/person/PATH_VARIABLE/address
.....
etc

Мне нужно заменить PATH_VARIABLE регулярным выражением, чтобы оно позволяло мне сопоставлять что-либо между разделителем / или ничем в конце, чтобы при сопоставлении строки регулярного выраженияс моим вводом String у меня полное совпадение

/person/abc/address/xy123 matches with the first
/person/abc/1233 matches with the second

Я попробовал несколько вещей

public static void main(String[] args) {

        // Sample Strings to be subtituted
        String y = "/person/PATH_VARIABLE/address/PATH_VARIABLE";
        String y1 = "/person/PATH_VARIABLE/PATH_VARIABLE";

        // Tried this 
        //y = y.replaceAll("PATH_VARIABLE", "\\((.*?)\\)");
        //y1 = y1.replaceAll("PATH_VARIABLE", "\\((.*?)\\)");

        // Tried this one
        y = y.replaceAll("PATH_VARIABLE", "(?<=/)(.*?)(?=/?)");
        y1 = y1.replaceAll("PATH_VARIABLE", "(?<=/)(.*?)(?=/?)");

        // Sample input strings to match 
        String x = "/person/user.zian/address/123";
        String x1 = "/person/nhbb/bhbhb/ghyu";
        String x2 = "/person/nhbb/bhbhb";


        System.out.println(x.matches(y)); // returns true
        System.out.println(x1.matches(y)); // returns false
        System.out.println(x1.matches(y1)); // returns true but should return false
        System.out.println(x2.matches(y1)); // returns true


    }

1 Ответ

1 голос
/ 27 апреля 2019

Вы слишком усложняете регулярное выражение, чтобы заменить "PATH_VARIABLE" на. Это может быть просто [^/]* - каждый символ, который не является /.

y = y.replaceAll("PATH_VARIABLE", "[^/]*");
y1 = y1.replaceAll("PATH_VARIABLE", "[^/]*");

Однако, это будет работать только в том случае, если остальная часть вашего пути не содержит символов, которые имеют специальные значения в регулярном выражении. В конкретном случае, который вы показали, у него нет таких символов.

Если ваш путь содержит подобные символы, вам нужно обернуть все, кроме PATH_VARIABLE в \Q и \E, чтобы они трактовались буквально.

Например, /person+hello/PATH_VARIABLE/address/PATH_VARIABLE должен был бы стать таким первым:

\Q/person+hello/\EPATH_VARIABLE\Q/address/\EPATH_VARIABLE

и затем вы можете заменить PATH_VARIABLE с.

Вы можете добавить \Q и \E, найдя начальный и конечный индексы всех PATH_VARIABLE с и вставив их в.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...