JAVA正则表达式

来源:互联网 发布:跳跃网络枪界 编辑:程序博客网 时间:2024/06/07 01:57
一、正则表达式
系统内使用的一些特殊的符号

二、字符类包括
java中用"\\"转义字符屏蔽特殊字符
\d 数字                                                                                  java:    \\d 数字
\D 非数字 
\w 单字字符(0-9,A-Z,a-z) 
\W 非单字字符 
\s 空白(空格符,换行符,回车符,制表符) 
\S 非空白 
[] 由方括号内的一个字符列表创建的自定义字符类 
. 匹配任何单个字符 
下面的字符将用于控制将一个子模式应用到匹配次数的过程. 
? 重复前面的子模式0次到一次 
* 重复前面的子模式0次或多次 
+ 重复前面的子模式一次到多次

[...] 位于括号之内的任意字符
[^...] 不在括号之中的任意字符
. 除了换行符之外的任意字符,等价于[^\n]
\w 任何单字字符, 等价于[a-zA-Z0-9]
\W 任何非单字字符,等价于[^a-zA-Z0-9]
\s 任何空白符,等价于[\ t \ n \ r \ f \ v]
\S 任何非空白符,等价于[^\ t \ n \ r \ f \ v]
\d 任何数字,等价于[0-9]
\D 除了数字之外的任何字符,等价于[^0-9]
[\b] 一个退格直接量(特例)
{n, m} 匹配前一项至少n次,但是不能超过m次
{n, } 匹配前一项n次,或者多次
{n} 匹配前一项恰好n次
? 匹配前一项0次或1次,也就是说前一项是可选的. 等价于 {0, 1}
+ 匹配前一项1次或多次,等价于{1,}
* 匹配前一项0次或多次.等价于{0,}
| 选择.匹配的要么是该符号左边的子表达式,要么它右边的子表达式
(...) 分组.将几个项目分为一个单元.这个单元可由 *、+、?和|等符号使用,而且还可以记住和这个组匹配的字符以供此后引用使用
\n 和第n个分组所匹配的字符相匹配.分组是括号中的子表达式(可能是嵌套的).分组号是从左到右计数的左括号数
  ^ 匹配的是字符的开头,在多行检索中,匹配的是一行的开头  
$ 匹配的是字符的结尾,在多行检索中,匹配的是一行的结尾
\b 匹配的是一个词语的边界.简而言之就是位于字符\w 和 \w之间的位置(注意:[\b]匹配的是退格符)
\B 匹配的是非词语的边界的字符 

三、实例
实例1:
String[] dataArr = { "moon", "mon", "moon", "mono" };
for (String str : dataArr) {
    String patternStr="m(o+)n";
    boolean result = Pattern.matches(patternStr, str);
if (result) {
     System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
}
else{
    System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
    }
模式是”m(o+)n”,它表示mn中间的o可以重复一次或多次,因此moon,mon,mooon能匹配成功,而mono在n后多了一个o,和模式匹配不上. 
注: +表示一次或多次;?表示0次或一次;*表示0次或多次。

实例2:
String[] dataArr = { "ban", "ben", "bin", "bon" ,"bun","byn","baen"};
for (String str : dataArr) {
    String patternStr="b[aeiou]n";
    boolean result = Pattern.matches(patternStr, str);
if (result) {
    System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
}
else{
    System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
    }
注:方括号中只允许的单个字符,模式“b[aeiou]n”指定,只有以b开头,n结尾,中间是a,e,i,o,u中任意一个的才能匹配上,所以数组的前五个可以匹配,后两个元素无法匹配.
方括号[]表示只有其中指定的字符才能匹配。

实例3:
String[] dataArr = { "been", "bean", "boon", "buin" ,"bynn"};
for (String str : dataArr) {
    String patternStr="b(ee|ea|oo)n";
    boolean result = Pattern.matches(patternStr, str);
if (result) {
    System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");
}
else{
    System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");
    }
注:如果需要匹配多个字符,那么[]就不能用上了,这里我们可以用()加上|来代替,()表示一组,|表示或的关系,模式b(ee|ea|oo)n就能匹配been,bean,boon等.
因此前三个能匹配上,而后两个不能。

实例4:

String[] dataArr = { "1", "10", "101", "1010" ,"100+"}; 
for (String str : dataArr) { 
    String patternStr="\\d+"; 
    boolean result = Pattern.matches(patternStr, str); 
if (result) { 
    System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");


else{ 
    System.out.println("字符串"+str+"匹配模式"+patternStr+"失败"); 
    } 
}

注:从前面可以知道,\d表示的是数字,而+表示一次或多次,所以模式\d+就表示一位或多位数字. 
因此前四个能匹配上,最后一个因为+号是非数字字符而匹配不上。

实例5:

String[] dataArr = { "a100", "b20", "c30", "df10000" ,"gh0t"};

for (String str : dataArr) {

    String patternStr="\w+\d+";

    boolean result = Pattern.matches(patternStr, str);

if (result) {

    System.out.println("字符串"+str+"匹配模式"+patternStr+"成功");

}

else{

    System.out.println("字符串"+str+"匹配模式"+patternStr+"失败");

    }

注:模式\w+\d+表示的是以多个单字字符开头,多个数字结尾的字符串,因此前四个能匹配上,最后一个因为数字后还含有单字字符而不能匹配. 

实例6:
String str="薪水,职位 姓名;年龄 性别";
String[] dataArr =str.split("[,\s;]");
for (String strTmp : dataArr) {
System.out.println(strTmp);
注:String类的split函数支持正则表达式,上例中模式能匹配”,”,单个空格,”;”中的一个,split函数能把它们中任意一个当作分隔符,将一个字符串劈分成字符串数组。

实例7:
String str="2007年12月11日";
Pattern p = Pattern.compile("[年月日]");
String[] dataArr =p.split(str);
for (String strTmp : dataArr) {
    System.out.println(strTmp);

注:Pattern是一个正则表达式经编译后的表现模式 ,它的split方法能有效劈分字符串. 
注意其和String.split()使用上的不同。


实例8:

String str="10元 1000人民币 10000元 100000RMB";

str=str.replaceAll("(\d+)(元|人民币|RMB)", "¥");

System.out.println(str); 

注:上例中,模式“(\d+)(元|人民币|RMB)”按括号分成了两组,第一组\d+匹配单个或多个数字,第二组匹配元,人民币,RMB中的任意一个,替换部分表示第一个组匹配的部分不变,其余组替换成¥。

替换后的str为¥10 ¥1000 ¥10000 ¥100000


实例9:
Pattern p = Pattern.compile("m(o+)n",Pattern.CASE_INSENSITIVE);
// 用Pattern类的matcher()方法生成一个Matcher对象
Matcher m = p.matcher("moon mooon Mon mooooon Mooon");
StringBuffer sb = new StringBuffer();
// 使用find()方法查找第一个匹配的对象
boolean result = m.find();
// 使用循环找出模式匹配的内容替换之,再将内容加到sb里
while (result) {
    m.appendReplacement(sb, "moon");
    result = m.find(); 
}
// 最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;
m.appendTail(sb);
System.out.println("替换后内容是" + sb.toString()); 

实例10:
String[] dataArr = { "google", "gooogle", "gooooogle", "goooooogle","ggle"};
for (String str : dataArr) {
    String patternStr = "g(o{2,5})gle";
    boolean result = Pattern.matches(patternStr, str);
if (result) {
    System.out.println("字符串" + str + "匹配模式" + patternStr + "成功");
} else {
    System.out.println("字符串" + str + "匹配模式" + patternStr + "失败");
    }
除了用+表示一次或多次,*表示0次或多次,?表示0次或一次外,还可以用{}来指定精确指定出现的次数,X{2,5}表示X最少出现2次,最多出现5次;X{2,}表示X最少出现2次,多则不限;X{5}表示X只精确的出现5次。

实例11:
String[] dataArr = { "Tan", "Tbn", "Tcn", "Ton","Twn"};
for (String str : dataArr) {
    String regex = "T[a-c]n";
    boolean result = Pattern.matches(regex, str);
if (result) {
    System.out.println("字符串" + str + "匹配模式" + regex + "成功");
} else {
    System.out.println("字符串" + str + "匹配模式" + regex + "失败");
    }
注:-表示从..到…,如[a-e]等同于[abcde] 

实例12:不区分大小写匹配
tring patternStr="ab";
Pattern pattern=Pattern.compile(patternStr, Pattern.CASE_INSENSITIVE);
String[] dataArr = { "ab", "Ab", "AB"};
for (String str : dataArr) {
    Matcher matcher=pattern.matcher(str);
if(matcher.find()){
    System.out.println("字符串" + str + "匹配模式" + patternStr + "成功"); 
    }
}
注:正则表达式默认都是区分大小写的,使用了Pattern.CASE_INSENSITIVE则不对大小写进行区分

实例13:使用正则表达式劈分字符串
注意这里要把复杂的模式写在前面,否则简单模式会先匹配上.
String input="职务=GM 薪水=50000 , 姓名=职业经理人 ; 性别=男 年龄=45 ";
String patternStr="(\s*,\s*)|(\s*;\s*)|(\s+)";
Pattern pattern=Pattern.compile(patternStr);
String[] dataArr=pattern.split(input);
for (String str : dataArr) {
    System.out.println(str);

实例14:解析正则表达式中的文字,对应第一个小括号括起来的group1
String regex="<(\w+)>(\w+)</>";
Pattern pattern=Pattern.compile(regex);
String input="<name>Bill</name><salary>50000</salary><title>GM</title>";
Matcher matcher=pattern.matcher(input);
while(matcher.find()){
    System.out.println(matcher.group(2));

实例15:将单词数字混合的字符串的单词部分大写
tring regex="([a-zA-Z]+[0-9]+)";
Pattern pattern=Pattern.compile(regex);
String input="age45 salary500000 50000 title";
Matcher matcher=pattern.matcher(input);
StringBuffer sb=new StringBuffer();
while(matcher.find()){
    String replacement=matcher.group(1).toUpperCase();
    matcher.appendReplacement(sb, replacement);
    }
matcher.appendTail(sb);
System.out.println("替换完的字串为"+sb.toString()); 

案例分析:

邮箱验证,以前验证邮箱,网上搜个正则装在自己程序里面就用,其实这是不对的,不同的公司对邮箱的验证格式是不一样的,比方说163和qq邮箱注册,他们要求的格式都不一样,所以搜一个正则表达式就去套所有的邮箱格式也是不对的,符合自己的需求的正则才是正确的。

下面的代码使用正则表达式验证输入格式包括了验证邮箱和验证手机号码

package p1;

import java.lang.reflect.Array;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class MyTest {

 public static void main(String[] args) {
 
  Map<String,String>  tokens=new HashMap<String,String>();
  //key-Set   values-List
 
 tokens.put("cat","Garfield");
 tokens.put("beverage", "coffee");
 
 String inputString = "${cat} really needs some ${beverage}.";
 
 String[]  ks=(String[])tokens.keySet().toArray(new String[0]);
   // System.out.println(ks[0]+ks[1]);   cat | beverage
 
 String str="";
    for(String s:ks){
     str+=s+"|";
    }
    str= str.substring(0, str.length()-2);
   
    System.out.println(str);
 
 String patternString = "\\$\\{(" + str + ")\\}";    //   '''\$  \{    \}'''   <pre>
 
 Pattern pattern = Pattern.compile(patternString);     //pattern
 Matcher matcher = pattern.matcher(inputString);
 
 
 StringBuffer  sb = new StringBuffer();    
 //String  s=""   s+=s   String  s  jvm  append  +
 
 while(matcher.find()) {
   matcher.appendReplacement(sb, tokens.get(matcher.group(1)));
 }
 
 matcher.appendTail(sb);
 
 System.out.println(sb.toString());
 
 matcher.reset();
 
 //out: cat really needs some beverage.
 System.out.println(matcher.replaceAll("$1"));
 //out: $1 really needs some $1.
 System.out.println(matcher.replaceAll(Matcher.quoteReplacement("$1")));
 
 System.out.println("------------------------------");
 
 //验证邮箱正确
 String emailPattern = "^([a-z0-9_\\.\\-\\+]+)@([\\da-z\\.\\-]+)\\.([a-z\\.]{2,6})$";
 pattern = Pattern.compile(emailPattern);
 matcher = pattern.matcher("test@qq.com");
 
 //验证是否邮箱
 System.out.println(matcher.find());
 //得到@符号前的邮箱名  out: test
 System.out.println(matcher.replaceAll("$1"));
 
 //获得匹配值
 String temp = "<meta-data android:name=\"appid\" android:value=\"joy\"></meta-data>";
 pattern = Pattern.compile("android:(name|value)=\"(.+?)\"");
 matcher = pattern.matcher(temp);
 while(matcher.find()) {
  //out: appid, joy
  System.out.println(matcher.group(2));
         }
     }

}








1 0
原创粉丝点击