0

我正在尝试了解 java 中正则表达式匹配的工作,并对以下代码片段有疑问

当我运行它时:http: //ideone.com/2vIK77

/* package whatever; // don't place package name! */

import java.util.*;
import java.lang.*;
import java.io.*;
import java.util.regex.*;

/* Name of the class has to be "Main" only if the class is public. */
class Ideone
{
    public static void main (String[] args) throws java.lang.Exception
    {


         String a = "Basic";
         String b = "Bas*";

         boolean matches = Pattern.matches(b, a); 
         System.out.println("1) "+matches);


        String text2    =
        "This is the text to be searched " +
        "for occurrences of the pattern.";

        String pattern2 = ".*is.*";

        boolean matches2 = Pattern.matches(pattern2, text2);

        System.out.println("matches2 = " + matches2);


    }
}

它在 first 上说 false ,在 second 上说 true 。

1) false
matches2 = true

我无法理解为什么我在第一种情况下会变得错误.. 我希望它是真的。有人可以给我一些建议吗

4

3 回答 3

5

第一个模式: "Bas*", 将匹配任何以开头"Ba"然后包含零个或多个s字符("Ba", "Bas","Bass"等)的字符串。这不匹配"Basic",因为“基本”不符合该模式。

第二个模式,".*is.*"使用通配符.,意思是“匹配任何字符” 。它将匹配任何包含字符串的任何文本,"is"其前面和/或后面有零个或多个其他字符。

文档Pattern详细描述了可以出现在模式中的所有特殊元素。

于 2013-09-18T04:54:33.997 回答
1

那是因为*表示“前一个字符的零个或多个”,即“s”。

文档matches说:

尝试将整个输入序列与模式匹配。

返回:
true 当且仅当整个输入序列与此匹配器的模式匹配

因此,“Bas*”仅描述输入文本的第一部分,而不是整个文本。如果您将模式更改为"Bas.*"(点字符表示“任何字符”),那么它将匹配,因为它会说:

"B" then "a" then "s" then any number of anything (.*) 
于 2013-09-18T04:54:22.047 回答
0

你在b变量中打错了,你想要的是Bas.*而不是Bas*

于 2013-09-18T04:54:27.157 回答