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));
}
出口'这是'
版权声明:本文博客原创文章。博客,未经同意,不得转载。