java正则表达式中matches()和find()的区别

ycggw6v2  于 2021-07-09  发布在  Java
关注(0)|答案(5)|浏览(190)

我试图理解 matches() 以及 find() .
根据javadoc(据我所知), matches() 将搜索整个字符串,即使它找到了要查找的内容,并且 find() 当它找到它要找的东西时就会停止。
如果这个假设是正确的,我看不出你想用什么时候 matches() 而不是 find() ,除非您要计算它找到的匹配数。
在我看来,string类应该 find() 而不是 matches() 作为一种内在的方法。
总结一下:
我的假设正确吗?
什么时候有用 matches() 而不是 find() ?

v2g6jxz6

v2g6jxz61#

matches() 仅当匹配完整字符串时才返回true。 find() 将尝试在子字符串中查找与正则表达式匹配的下一个匹配项。注意强调“下一个”。也就是说,打电话的结果 find() 多次可能不一样。此外,通过使用 find() 你可以打电话 start() 返回子串匹配的位置。

final Matcher subMatcher = Pattern.compile("\\d+").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + subMatcher.matches());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find() + " - position " + subMatcher.start());
System.out.println("Found: " + subMatcher.find());
System.out.println("Found: " + subMatcher.find());
System.out.println("Matched: " + subMatcher.matches());

System.out.println("-----------");
final Matcher fullMatcher = Pattern.compile("^\\w+$").matcher("skrf35kesruytfkwu4ty7sdfs");
System.out.println("Found: " + fullMatcher.find() + " - position " + fullMatcher.start());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Found: " + fullMatcher.find());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());
System.out.println("Matched: " + fullMatcher.matches());

将输出:

Found: false
Found: true - position 4
Found: true - position 17
Found: true - position 20
Found: false
Found: false
Matched: false
-----------
Found: true - position 0
Found: false
Found: false
Matched: true
Matched: true
Matched: true
Matched: true

所以,打电话时要小心 find() 如果 Matcher 对象没有重置,即使正则表达式被 ^ 以及 $ 匹配整个字符串。

2izufjch

2izufjch2#

find() 将根据正则表达式考虑子字符串,其中 matches() 将考虑完整的表达。 find() 仅当表达式的子字符串与模式匹配时,才会返回true。

public static void main(String[] args) {
        Pattern p = Pattern.compile("\\d");
        String candidate = "Java123";
        Matcher m = p.matcher(candidate);

        if (m != null){
            System.out.println(m.find());//true
            System.out.println(m.matches());//false
        }
    }
omqzjyyz

omqzjyyz3#

matches 尝试将表达式与整个字符串匹配,并隐式添加 ^ 开始和结束时 $ 在模式的末尾,意味着它不会寻找子字符串。因此,此代码的输出:

public static void main(String[] args) throws ParseException {
    Pattern p = Pattern.compile("\\d\\d\\d");
    Matcher m = p.matcher("a123b");
    System.out.println(m.find());
    System.out.println(m.matches());

    p = Pattern.compile("^\\d\\d\\d$");
    m = p.matcher("123");
    System.out.println(m.find());
    System.out.println(m.matches());
}

/* output:
true
false
true
true

* /

``` `123` 是的子字符串 `a123b` 所以 `find()` 方法输出true。 `matches()` 只“看见” `a123b` 这和 `123` 因此输出为假。
yi0zb3m4

yi0zb3m44#

matches 如果整个字符串与给定模式匹配,则返回true。 find 尝试查找与模式匹配的子字符串。

zpjtge22

zpjtge225#

matches(); 不缓冲,但 find() 缓冲器。 find() 首先搜索到字符串的末尾,对结果编制索引,然后返回布尔值和相应的索引。
这就是为什么当你有一个像

1:Pattern.compile("[a-z]");

2:Pattern.matcher("0a1b1c3d4");

3:int count = 0;

4:while(matcher.find()){

5:count++: }

第4点:使用模式结构的regex引擎将通读整个代码(由 regex[single character] 找到至少一个匹配项。如果找到这样的匹配项,它将被索引,然后循环将根据索引结果执行,否则,如果它没有进行如下的提前计算 matches() ; 没有。while语句永远不会执行,因为匹配字符串的第一个字符不是字母表。

相关问题