java正则表达式有时无法匹配

时间:2013-09-18 04:49:43

标签: java regex string

我试图理解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);


    }
}

它说 第一个是假,第二个是真。

1) false
matches2 = true

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

3 个答案:

答案 0 :(得分:5)

第一种模式:"Bas*",将匹配以"Ba"开头的任何字符串,然后由零个或多个s字符组成("Ba""Bas""Bass"等)。这与"Basic"无法匹配,因为“Basic”不符合该模式。

第二种模式".*is.*"使用外卡字符.,这意味着“匹配任何字符”。它将匹配任何文本中包含字符串"is"的文本,前面和/或后跟零个或多个其他字符。

docs for Pattern详细描述了模式中可能出现的所有特殊元素。

答案 1 :(得分:1)

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

matches的文档说:

  

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

     

<强>返回:
  当且仅当整个输入序列与此匹配器的模式匹配时才为真

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

"B" then "a" then "s" then any number of anything (.*) 

答案 2 :(得分:0)

你在b变量中输了一个拼写错误,你想要的是Bas.*而不是Bas*