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}" + ")+" );
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 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);
原文:http://blog.csdn.net/baidu_nod/article/details/38292221