簡體   English   中英

不帶錨點的Java中不區分大小寫的字符串匹配

[英]Case-insensitive string matching in Java without anchors

注意 :這不是關於不區分大小寫匹配的問題。 這是關於regex錨點的問題。

我在Java中進行基本的不區分大小寫的匹配時遇到了很多麻煩:

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class match {
    public static void main(String[] args) {
        String prompt="das101.lo1>";
        String str="automate@DAS101.LO1>";

        Pattern ignore = Pattern.compile(prompt.toUpperCase(), Pattern.CASE_INSENSITIVE);
        Matcher mIgn  = ignore.matcher(str);
        if(mIgn.matches())
            System.out.println(str+" Matches " + prompt.toUpperCase());
        else
            System.out.println(str+" Doesn't Match " + prompt.toUpperCase());

        char[] cStr = str.toCharArray();
        char[] cPrompt = prompt.toUpperCase().toCharArray();

        /* Verify that strings match */
        for(int i=cPrompt.length-1, j=cStr.length-1; i>=0 && j>=0 ; --i,--j) {
            if (cPrompt[i]==cStr[j])
                System.out.println("Same: "+ cPrompt[i]+":" + cStr[j]);
            else
                System.out.println("Different: "+ cPrompt[i]+":" + cStr[j]);
        }
    }
}

輸出:

samveen@javadev-tahr:/tmp$ javac match.java
samveen@javadev-tahr:/tmp$ java match
automate@DAS101.LO1> Doesn't Match DAS101.LO1>
Same: >:>
Same: 1:1
Same: O:O
Same: L:L
Same: .:.
Same: 1:1
Same: 0:0
Same: 1:1
Same: S:S
Same: A:A
Same: D:D

如果我將if(mIgn.matches())更改為if(mIgn.find()) ,我會得到這個簡單的字符串模式匹配工作:

samveen@javadev-tahr:/tmp$ javac match.java
samveen@javadev-tahr:/tmp$ java match
automate@DAS101.LO1> Matches DAS101.LO1>
Same: >:>
Same: 1:1
Same: O:O
Same: L:L
Same: .:.
Same: 1:1
Same: 0:0
Same: 1:1
Same: S:S
Same: A:A
Same: D:D

我哪里錯了?

我提到了Java RegEx中的Case-Insensitive MatchingPattern Class的方法

String.matches需要整個字符串匹配模式。 好像模式有隱含的“^ ... $”。

Pattern ignore = Pattern.compile(".*" + Pattern.quote(prompt) + ".*",
    Pattern.CASE_INSENSITIVE);

是為了尋找匹配。

這可以使用原始模式完成:

if (mIgn.find()) {
    System.out.println("Found at position " + mIgn.start());
}

如果整個字符串與給定模式匹配,則匹配返回true。 為此,它為ur匹配前綴為'^',后綴為'$'符號,因此它不會查找子字符串。

find()在子串匹配的情況下也返回true。

看看 - Java Regex中的matches()和find()之間的區別

matches()僅在整個輸入與模式匹配時才返回true ,而不是在輸入的一部分與模式匹配時返回true

輸入automate@DAS101.LO1>與完整模式das101.lo1>不匹配。

這解釋了使用find()而不是matches()時得到的不同結果。

使用?i regex和.matches進行不區分大小寫的匹配:

    // ?i = case insensitive match
    if (mIgn.matches("(?i:str)")) {
        ......
    } else {
        ......
    }

將此實用程序方法用於不區分大小寫的匹配項

 // utlity method for mathcesIgonerCase
 public static boolean mathcesIgonerCase(String string1, String sentence){
     return string1.matches("(?i:.*"+sentence+".*)");
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM