0

我有一个路径为/mypath/check/10.10/-123.11. 如果(可选)小数点后有 3 位而不是 2 位,我想返回 true,例如/mypath/check/10.101/-123.112在匹配时应该返回 true。两次出现的小数点前应完全匹配。

举一些例子:成功

/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

4 回答 4

0

试用/mypath/check/10\.10/-?123\.11[ ]*=[ ]*/mypath/check/(\d\d)\.\1\d?/
演示

于 2020-05-04T22:50:36.680 回答
0

我假设第一个 URL 在每个小数点后总是正好有 2 位数字。如果是这样,请将第二个 URL 与通过在第一个 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
于 2020-05-05T03:02:17.633 回答
0

尝试这个:

 url1.equals(url2) || url1.equals(url2.replaceAll("\\d$", ""))
于 2020-05-04T23:26:08.547 回答
0

主意

应可选匹配的正则表达式子模式以?修饰符为后缀。在您的情况下,这适用于小数点后的第三个字符。

相等性测试模可以在匹配上下文模式的每次出现并用空字符串替换匹配中的可选部分时实现可选数字。在此规范化之后,可以测试字符串是否相等。

代码

// 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)

于 2020-05-04T22:00:15.230 回答