我试图理解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
我无法理解为什么我在第一种情况下会弄错..我希望它是真的。 有人可以建议我一些事情
答案 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*