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@163.com".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));
}
输出'是'