Java соответствует двум строкам без последнего символа - PullRequest
0 голосов
/ 05 мая 2020

У меня есть URL с путем /mypath/check/10.10/-123.11. Я хочу вернуть истину, если (необязательно) после десятичной дроби 3 цифры вместо 2, например, /mypath/check/10.101/-123.112 должен возвращать истину при совпадении. Перед десятичной дробью для обоих случаев должно быть точное совпадение.

Чтобы процитировать несколько примеров: Успех

/mypath/check/10.10/-123.11 = /mypath/check/10.101/-123.112
/mypath/check/10.10/-123.11 = /mypath/check/10.101/-123.11
/mypath/check/10.10/-123.11 = /mypath/check/10.10/-123.112
/mypath/check/10.10/123.11 = /mypath/check/10.101/123.112

.. и так далее

Ошибка:

/mypath/check/10.10/-123.11 != /mypath/check/10.121/-123.152
/mypath/check/10.11/-123.11 != /mypath/check/10.12/-123.11

Числа перед десятичной дробью могут включать - с цифрами от 1 до 3.

Ответы [ 4 ]

0 голосов
/ 05 мая 2020

Я предполагаю, что первый URL всегда имеет ровно 2 цифры после каждой десятичной точки. Если это так, сопоставьте второй URL-адрес с регулярным выражением, сформированным путем добавления необязательного di git в конец каждой десятичной дроби в первом URL-адресе.

static boolean matchURL(String url1, String url2)
{
    return url2.matches(url1.replaceAll("([.][0-9]{2})", "$1[0-9]?"));      
}

Тест:

String url1 = "/mypath/check/10.10/-123.11";

List<String> tests = Arrays.asList(
        "/mypath/check/10.10/-123.11",
        "/mypath/check/10.10/-123.111",
        "/mypath/check/10.101/-123.11",
        "/mypath/check/10.101/-123.111",
        "/mypath/check/10.11/-123.11"
        );

for(String url2 : tests)
    System.out.format("%s : %s = %b%n", url1, url2, matchURL(url1, url2));

Вывод:

/mypath/check/10.10/-123.11 : /mypath/check/10.10/-123.11 = true
/mypath/check/10.10/-123.11 : /mypath/check/10.10/-123.111 = true
/mypath/check/10.10/-123.11 : /mypath/check/10.101/-123.11 = true
/mypath/check/10.10/-123.11 : /mypath/check/10.101/-123.111 = true
/mypath/check/10.10/-123.11 : /mypath/check/10.11/-123.11 = false
0 голосов
/ 05 мая 2020

Попробовать /mypath/check/10\.10/-?123\.11[ ]*=[ ]*/mypath/check/(\d\d)\.\1\d?/
демо

0 голосов
/ 05 мая 2020

Попробуйте следующее:

 url1.equals(url2) || url1.equals(url2.replaceAll("\\d$", ""))
0 голосов
/ 05 мая 2020

Идея

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

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

Код

// Initializing test data.
// Will compare Strings in batch1, batch2 at the same array position.
//
String[] batch1 = {
        "/mypath/check/10.10/-123.11"
      , "/mypath/check/10.10/-123.11"
      , "/mypath/check/10.10/-123.11"
      , "/mypath/check/10.10/123.11"

      , "/mypath/check/10.10/-123.11"
      , "/mypath/check/10.11/-123.11"
    };
String[] batch2 = {
        "/mypath/check/10.101/-123.112"
      , "/mypath/check/10.101/-123.11" 
      , "/mypath/check/10.10/-123.112" 
      , "/mypath/check/10.101/123.112"

      , "/mypath/check/10.121/-123.152"                           
      , "/mypath/check/10.12/-123.11"                           
    };

// Regex pattern used for normalization:
//    - Basic pattern: decimal point followed by 2 or 3 digits
//    - Optional part: 3rd digit of the basic pattern
//    - Additional context: Pattern must match at the end of the string or be followed by a non-digit character.
//
Pattern re_p = Pattern.compile("([.][0-9]{2})[0-9]?(?:$|(?![0-9]))");

// Replacer routine for processing the regex match. Returns capture group #1
Function<MatchResult, String> fnReplacer= (MatchResult m)-> { return m.group(1); };


// Processing each test case
// Expected result
//    match
//    match
//    match
//    match
//    mismatch
//    mismatch
//
for ( int i = 0; i < batch1.length; i++ ) {
    String norm1 = re_p.matcher(batch1[i]).replaceAll(fnReplacer);
    String norm2 = re_p.matcher(batch2[i]).replaceAll(fnReplacer);

    if (norm1.equals(norm2)) {
        System.out.println("Url pair #" + Integer.toString(i) + ": match ( '" + norm1 + "' == '" + norm2 + "' )");
    } else {
        System.out.println("Url pair #" + Integer.toString(i) + ": mismatch ( '" + norm1 + "' != '" + norm2 + "' )");
    }
}

Демо доступно здесь (ideone.com) .

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