Pattern它是为满足图案

Matcher该模型是用来匹配所产生的结果字符串

String类本身matches这种方法。这表明该字符串不匹配这个模式(模式是输入String)


\d  表示一个数字  example       "a4dfds323".replaceAll("\\d","-")   前面那个'\'是转义字符

. 不论什么一个字符,并不包括行结束符

\D  不是数字的一个字符

\s  空白字符  包括[\t\n\f\r]

\S 不是空白字符

\w  a word char [a-zA-Z_0-9]

\W  a non-word char



X?

X,一次或一次也没有

X*

X,零次或多次

X+

X。一次或多次

X{n}

X,恰好 n

X{n,}

X。至少 n

X{n,m}

X。至少 n 次。可是不超过 m


对于Email的匹配:

public static final Pattern EMAIL_ADDRESS
= Pattern.compile(
"[a-zA-Z0-9\\+\\.\\_\\%\\-]{1,256}" + //这个含义是至少有一个[a-zA-Z0-9] 然后能够有. _ % -
"\\@" + //中间@
"[a-zA-Z0-9][a-zA-Z0-9\\-]{0,64}" + //
"(" +
"\\." +
"[a-zA-Z0-9][a-zA-Z0-9\\-]{0,25}" +
")+"
);


关于PhoneNumber的匹配:

public static final Pattern PHONE
= Pattern.compile( // sdd = space, dot, or dash
"(\\+[0-9]+[\\- \\.]*)?" // +<digits><sdd>*
+ "(\\([0-9]+\\)[\\- \\.]*)?" // (<digits>)<sdd>* p("()".matches("\\(\\)"))为true,括弧前必须加\\
+ "([0-9][0-9\\- \\.][0-9\\- \\.]+[0-9])"); // <digit><digit|sdd>+<digit>


假设匹配一个空白行

public static void main(String[] args) {
p(" \n".matches("^[\\s&&[^\\n]]+\\n$")); //^代表开头 ,$表示结尾 true
}

public static void p(Object s) {
System.out.println(s);
}



分组:

Pattern p = Pattern.compile("\\d{3,5}[a-z]{2}");
String s = "123aa-23434bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()){
p(m.group());
}
会打印出结果
123aa
23434bb
234cc


假设我们仅仅想要数字 我们必须把pattern改成:

Pattern p = Pattern.compile("(\\d{3,5})([a-z]{2})");
String s = "123aa-23434bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()){
p(m.group(1));
}
结果:
123
23434
234


第一个左小括号是第一组。第二个小左括号是第二组

写一个比較简单的email的匹配:

p("sdfsdfsdfsdfsdf@".matches("[\\w[.-]]+@[\\w[.-]]+\\.[\\w]+"));  true \\w为单词字符



关于Find:

Pattern p = Pattern.compile("\\d{3,5}");
String s = "123-34343-3434-00";

Matcher m = p.matcher(s);
// p(m.matches()); //false matches会跟find会冲突
// m.reset();

p(m.find()); //true 123
//想知道起始位置和结束位置
p(m.start()+"-"+m.end()); //0-3

p(m.find()); //true 34343
p(m.start()+"-"+m.end()); //4-9

p(m.find()); //true 3434
p(m.start()+"-"+m.end());

p(m.find()); //false 00
// p(m.start()+"-"+m.end()); //输出这个会报错

p(m.lookingAt()); //每一次找从開始的位置找。true
p(m.lookingAt()); //每一次找从開始的位置找,true


关于替换:

Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
StringBuffer buf = new StringBuffer();
Matcher m = p.matcher("sfsdjavaeereJAVAdsfd");
//要求把第一个小写的java换成大写的,第二个大写的JAVA换成小写的
int i = 0;
while(m.find()) {
i++;
if(i%2== 0) {
m.appendReplacement(buf, "java");
}else{
m.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf);
p(buf);



Pattern pattern = Pattern.compile("\\[(\\S+?)\\]");
Matcher matcher = pattern.matcher("[是]");
while(matcher.find()) {
System.out.println(matcher.group(1));
}
出口'这是'