Создать регулярное выражение строки - PullRequest
0 голосов
/ 18 февраля 2019

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

String inputString = "https://*.mlc.net/Gateway/api/Transmissions/State (body 0 bytes)";

String strToMatch = "https://abc.mlc.net/Gateway/api/Transmissions/State (body 0 bytes)";

Я сделал это следующим образом:

String regex = inputString.replace("*", "(.*)");

strToMatch.matches(regex) 

, но это не удалось.Может кто-нибудь объяснить, пожалуйста, код?

Я знаю, что перед переинтезом требуется обратная косая черта, но потребуется код, который будет работать для всех символов входной строки.

Ответы [ 2 ]

0 голосов
/ 18 февраля 2019

Ваше регулярное выражение не совпадает, потому что в вашей входной строке есть метасимволы регулярных выражений.А именно, механизм регулярных выражений интерпретирует круглые скобки вокруг body 0 bytes как группу захвата вместо буквальных скобок.Вы хотите, чтобы все во входной строке соответствовали буквально , кроме (.*) частей, верно?

Вы можете разделить входную строку с помощью *, затем для каждой части вызовитеPattern.quote для экранирования всех метасимволов регулярных выражений.Наконец, вы объединяете части вместе с (.*):

private static String createRegex(String inputString) {
    String[] parts = inputString.split("\\*");
    return Arrays.stream(parts).map(Pattern::quote).collect(Collectors.joining("(.*)"));
}
0 голосов
/ 18 февраля 2019

Вам также нужно экранировать символы, которые имеют значение в регулярном выражении:

    String regex = formatRe(inputString);

...

private static String formatRe(String inputString) {
    StringBuilder buf = new StringBuilder();
    for (char c: inputString.toCharArray()) {
        switch (c) {
            case '*':
                buf.append("(.*)");
                break;
            case '.':
            case '(':
            case ')':
            case '[':
            case ']':
                // ...
                buf.append('\\');
                buf.append(c);
                break;
            case '\t':
                buf.append("\\t");
                break;
            default:
                buf.append(c);
                break;
        }
    }
    return buf.toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...