java 正则表达式

http://tool.oschina.net/regex/ 学习网站

正则表达式就是用于操作字符串的规

正则对字符串的常见的操作:

  • 匹配:matches

  • 切割:split()

  • 替换:replaceAll(String regex, String replacement)

public class Test03 {

    public static void main(String[] args) {
        testPhone("13247842137");
        testTel("021-2456789");
        testSplit("爱  情");//中间有两个空隔
        testSplit2("北京京欢迎迎迎迎你");
    }
    //测试手机号:第一位为1   第二位3/5/8    一共长度11位
    public static void testPhone(String test){
        System.out.println(test.matches("1[358]\\d{9}")?"合法手机号":"非法手机号");
    }
    
    /*测试固话:区号-主机号  
     *区号: 首位是0 长度3~4
     *主机号: 首位不能为0 长度7~8*/
    public static void testTel(String test){
        System.out.println(test.matches("0\\d{2,3}-[1-9]\\d{6,7}")?"合法固话":"非法固话");
    }
    
    //去除字符中的空隔
    public static void testSplit(String test){
        System.out.println(Arrays.toString(test.split(" +")));//有一个或多个" "都可以切掉
        //System.out.println(Arrays.toString(test.split(" ")));没有量词修饰,只能匹配一个" "
    }

    //去掉重复的文字
    public static void testSplit2 (String test){
        System.out.println(Arrays.toString(test.split("(.)\\1+")));
        /*
         先匹配出一个任意字符,然后接着引用第一个字符做匹配*/
    }

    //需求: 把手机号替换成***    
    public static void repalcePhone(){
        String str = "如果有需要请联系:13556084321如果有需要请联系:13556084321如果有需要请联系:13556084321如果有需要请联系:13556084321"
                + "如果有需要请联系:13556084321如果有需要请联系:13556084321如果有需要请联系:13556084321如果有需要请联系:13556084321如果有需要请联系:13556084321";
        
        String reg = "1[34578]\\d{9}";
        str = str.replaceAll(reg, "****");
        System.out.println("帖子的内容:"+ str);
    }
    
    //需求: 把重叠词替换成单个字符。
    public static void repalce2(){
        String str = "我我我我我要要要成成成成成成为为高富富富富富富帅帅帅帅帅帅帅帅帅帅帅帅帅帅帅帅帅帅帅帅";
        str = str.replaceAll("(.)\\1+", "$1");   //注意引用正则的内容如果不是在一个正则表达式内部,那么需要使用 :  "$组号" 进行引用
        System.out.println(str);
    }
}

正则查找:

如果正则表达式需要查找内容需要使用以下两个对象:

  • Pattern(正则对象)
  • Matcher(匹配器对象)

指定为字符串的正则表达式必须首先被编译为此类Pattern的实例。然后,Pattern对象可以与任意字符序列匹配 ,匹配字符串之后就可以得到一个 Matcher 对象,所涉及与字符串匹配的状态都驻留在匹配器中 .

典型的调用顺序是
Pattern p = Pattern.compile("正则");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();

匹配器常用的方法
find() 通知匹配器去查找符合该正则的字符串。如果存在符合规则的字符串返回true,否则返回false.
group() 获取符合规则的字符串。

*** 注意 ***: 使用匹配器的方法时候,要先调用find方法才能调用group方法。 否则匹配器没有去查找合适的内容,报错。

public class Demo4 {
    
    //找出三个字符构成的单词。
    public static void main(String[] args) {
        String data = "hou tian  you  ke  yi fang jia liao ,da jia shuang ma";
        String reg = "\\b[a-z]{3}\\b"; //找出a-z的三个字符,并且是一个完整的单词
        //第一步:先要把字符串的正则编译成Pattern对象
        Pattern p = Pattern.compile(reg);
        //第二步: 使用正则对象去匹配字符串,得到一个matcher 对象。
        Matcher m  = p.matcher(data);

        while(m.find()){
            System.out.println(m.group());
        }   
    }
}

练习:

需求:把下面的邮箱提取出来

" 有事没事联系:[email protected] 有事没事联系:[email protected] 有事没事联系:[email protected]  有事没事联系:[email protected] 有事没事联系:[email protected] 有事没事联系:[email protected]"; 
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Demo04 {

    public static void main(String[] args) {
        String value = " 有事没事联系:[email protected] 有事没事联系:[email protected] 有事没事联系:[email protected] "
                + "有事没事联系:[email protected] 有事没事联系:[email protected] 有事没事联系:[email protected]";
        List list = getEmail(value);
        for(String str :list){
            System.out.println(str);
        }
    }

    public static List getEmail(String value){
        Pattern p = Pattern.compile("\\w+@\\w{2,}(\\.(com|net|cn|gmail))+");
        /*解读:
         * (com|net):表示com或者net  
         * \\.(com|net):表示.com或.net 
         * (\\.(com|net))+:.com或.net最少一次
         */
        Matcher m = p.matcher(value);
        List list = new ArrayList();
        while(m.find()){
            list.add(m.group());
        }
        return list;
    }
}
附加:

*** 字符类 ***
[abc] a、b 或 c(简单类)
[^abc] 任何字符,除了 a、b 或 c(否定) //^在外面表示头部
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内(范围)
注意:里面不管有多少内容,没有量词的修饰也只能匹配一个字符而已

*** 预定义字符类 ***
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]

*** Greedy 数量词 ***
X? : X,一次或一次也没有
X* : X,零次或多次
X+ : X,一次或多次
X{n} : X,恰好 n 次
X{n,} : X,至少 n 次
X{n,m} : X,至少 n 次,但是不超过 m 次

*** 分组知识: ***
((A)(B(C)))
有4组:通过"("个数来判断
第一组:((A)(B(C)))
第二组:(A)
第三组:(B(C))
第四组:(C)
\n:引用第n组匹配到的内容

*** 其他 ***
\b 单词边界匹配器: 单词边界匹配器不匹配 任何 的字符,只是代表了一个单词的开始或者结束部分。

你可能感兴趣的:(java 正则表达式)