A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 洛奇亚 中级黑马   /  2015-10-12 21:45  /  488 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

正则表达式:

1、常见正则表达式符号:

字符
x        字符 x
\\        反斜线字符
\0n        带有八进制值 0 的字符 n (0 <= n <= 7)
\0nn        带有八进制值 0 的字符 nn (0 <= n <= 7)
\0mnn        带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7)
\xhh        带有十六进制值 0x 的字符 hh
\uhhhh        带有十六进制值 0x 的字符 hhhh
\t        制表符 ('\u0009')
\n        新行(换行)符 ('\u000A')
\r        回车符 ('\u000D')
\f        换页符 ('\u000C')
\a        报警 (bell) 符 ('\u0007')
\e        转义符 ('\u001B')
\cx        对应于 x 的控制符

字符类
[abc]        a、b 或 c(简单类)
[^abc]        任何字符,除了 a、b 或 c(否定)
[a-zA-Z]        a 到 z 或 A 到 Z,两头的字母包括在内(范围)
[a-d[m-p]]        a 到 d 或 m 到 p:[a-dm-p](并集)
[a-z&&[def]]        d、e 或 f(交集)
[a-z&&[^bc]]        a 到 z,除了 b 和 c:[ad-z](减去)
[a-z&&[^m-p]]        a 到 z,而非 m 到 p:[a-lq-z](减去)

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

POSIX 字符类(仅 US-ASCII)
\p{Lower}        小写字母字符:[a-z]
\p{Upper}        大写字母字符:[A-Z]
\p{ASCII}        所有 ASCII:[\x00-\x7F]
\p{Alpha}        字母字符:[\p{Lower}\p{Upper}]
\p{Digit}        十进制数字:[0-9]
\p{Alnum}        字母数字字符:[\p{Alpha}\p{Digit}]
\p{Punct}        标点符号:!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
\p{Graph}        可见字符:[\p{Alnum}\p{Punct}]
\p{Print}        可打印字符:[\p{Graph}\x20]
\p{Blank}        空格或制表符:[ \t]
\p{Cntrl}        控制字符:[\x00-\x1F\x7F]
\p{XDigit}        十六进制数字:[0-9a-fA-F]
\p{Space}        空白字符:[ \t\n\x0B\f\r]

java.lang.Character 类(简单的 java 字符类型)
\p{javaLowerCase}        等效于 java.lang.Character.isLowerCase()
\p{javaUpperCase}        等效于 java.lang.Character.isUpperCase()
\p{javaWhitespace}        等效于 java.lang.Character.isWhitespace()
\p{javaMirrored}        等效于 java.lang.Character.isMirrored()

Unicode 块和类别的类
\p{InGreek}        Greek 块(简单块)中的字符
\p{Lu}        大写字母(简单类别)
\p{Sc}        货币符号
\P{InGreek}        所有字符,Greek 块中的除外(否定)
[\p{L}&&[^\p{Lu}]]         所有字母,大写字母除外(减去)

边界匹配器
^        行的开头
$        行的结尾
\b        单词边界
\B        非单词边界
\A        输入的开头
\G        上一个匹配的结尾
\Z        输入的结尾,仅用于最后的结束符(如果有的话)
\z        输入的结尾

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

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

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

Logical 运算符
XY        X 后跟 Y
X|Y        X 或 Y
(X)        X,作为捕获组

Back 引用
\n        任何匹配的 nth 捕获组

引用
\        Nothing,但是引用以下字符
\Q        Nothing,但是引用所有字符,直到 \E
\E        Nothing,但是结束从 \Q 开始的引用

特殊构造(非捕获)
(?:X)        X,作为非捕获组
(?idmsux-idmsux)         Nothing,但是将匹配标志i d m s u x on - off
(?idmsux-idmsux:X)          X,作为带有给定标志 i d m s u x on - off
(?=X)        X,通过零宽度的正 lookahead
(?!X)        X,通过零宽度的负 lookahead
(?<=X)        X,通过零宽度的正 lookbehind
(?<!X)        X,通过零宽度的负 lookbehind
(?>X)        X,作为独立的非捕获组



2、正则表达式对字符串的常见操作
package cn.itcast.regex.demo;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexDemo2 {
        public static void main(String[] args) {
                // 是你上了大学还是大学上了你。我们相互享受,乐在其中
                /*
                 * 正则表达式对字符串的常见操作:
                 * 1,匹配:
                 *                  其实使用的就是String类中的matches方法。
                 * 2,切割:
                 *                 其实使用的就是String类中的split方法。
                 * 3,替换:
                 *          其实使用的就是String类中的replaceAll方法。
                 * 4,获取:
                 *                  
                 *  
                 */
                functionDemo_4();
        }
        /*
         * 获取:
         *
         *         //将正则规则进行对象的封装;
         * Pattern p=Pattern.compile("a*b");
         *
         *         //通过正则对象的matcher方法字符串相关联。获取要对字符串操作的匹配器对象Matcher。
         * Matchr m=p.matcher("aaaab");
         *
         *         //通过Matcher匹配器对象的方法对字符串进行操作。
         * boolean b=m.matches();
         *
         */
        private static void functionDemo_4() {
               
                String str="da jia hao,ming tian bu fang jia!";
               
                String regex="\\b[a-z]{3}\\b";
               
                //1,将正则封装成对象
                Pattern p=Pattern.compile(regex);
               
                //2,通过正则对象获取匹配器对象。
                Matcher m=p.matcher(str);
               
                //3,使用Matcher对象的方法对字符串进行操作。
                //查找 find();
               
                while(m.find()){
                       
                        System.out.println(m.group());//获取匹配的子序列
               
                        System.out.println(m.start()+":"+m.end());//获取子序列的起始位置和终止位置
                }
        }
        /*
         * 替换。
         * replaceAll方法
         */
        public static void functionDemo_3() {
               
                String str="zxcxbvwwwwQdqedsaaacdsad";
               
                str=str.replaceAll("(.)\\1+", "$1");
               
                System.out.println(str);
               
                String tel="15823512111";//158****2111
               
                tel=tel.replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2");
               
                System.out.println(tel);
               
        }
        /*
         * 切割。
         *
         * (X) X,作为捕获组                    \n 任何匹配的 nth 捕获组
         *
         *捕获组可以通过从左到右计算其开括号来编号 :
         *
         * 在表达式((A)(B(C))) 中,存在四个这样的组:
         *
         * 1 ((A)(B(C)))
         * 2 \A
         * 3 (B(C))
         * 4 (C)
         */
        public static void functionDemo_2() {
                /*
                 * String str="zhangsan    xiaoqiang            zhaoliu"; String
                 * name[]=str.split(" +");
                 */// 空格出现一次或者多次
                /*
                 * String str="zhangsan.xiaoqiang.zhaoliu"; String
                 * name[]=str.split("\\.");
                 */
                String str = "zhangsantttttxiaoqiangmmmmmmzhaoliu";
                String name[] = str.split("(.)\\1+");// 在使用第一组的内容。(X) X,作为捕获组
                for (String names : name) {
                        System.out.println(names);
                }
        }
        /*
         * 演示匹配:
         */
        public static void functionDemo_1() {
                // 匹配手机号码是否正确。
                String tel = "1435123435";
                String regex = "1[358]\\d{9}";// \d等价于[0-9];并且由于\在Java中是转义字符,故要使用\\
                boolean b = tel.matches(regex);
                System.out.println(b);
        }
}


3、练习(重点)
package cn.itcast.regex.test;
import java.util.TreeSet;
public class RegexTest {
        public static void main(String[] args) {
                /*
                 * 1,治疗口吃: 我我我...我我..我我要..要要要要..要学..学学学..编编..编程
                 * 2,对ip地址排序
                 * 3,对邮件地址校验
                 */
                test_3();
               
        }
        /*
         * 对邮件地址校验
         */
        public static void test_3() {
               
                String mail="abc1@sina.com.cn";
               
                String regex="[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]{1,3}){1,3}";
               
        /*        regex="\\w+@\\w+(\\.\\w+)+";//1@1.1
               
                mail.indexOf("@")!=-1;*/
               
                boolean b=mail.matches(regex);
               
                System.out.println(mail+":"+b);
               
        }
        /*
         * ip地址排序。
         *
         * 192.168.1.123 127.0.0.1 105.70.11.55
         *
         */
        public static void test_2() {
               
                String ip_str="192.168.1.123 127.0.0.1 3.3.3.3 105.70.11.55";
               
                //1,为了让IP地址可以按照字符串顺序比较,只要让ip的每一段的位数相同。
                //所以,补零。按照每一位所需要最多0进行补充。每一段都加两个0.
               
                ip_str=ip_str.replaceAll("(\\d+)", "00$1");
               
                //然后每一段保留数字3位
                ip_str=ip_str.replaceAll("0*(\\d{3})", "$1");
               
                //System.out.println(ip_str);
               
                //将IP地址切出
                String[] ips=ip_str.split(" +");
               
                TreeSet<String> ts=new TreeSet<String>();
               
                for(String ip:ips){
                       
        //                System.out.println(ip);
                       
                        ts.add(ip);
                }
               
                for(String ip:ts){
                       
                        System.out.println(ip);
                       
                }
               
                for(String ip:ts){
                        System.out.println(ip.replaceAll("0*(\\d+)","$1"));
                }
               
        }
        /*
         * 治口吃。
         */
        public static void test_1(){
                String str="我我我...我我..我我要..要要要要..要学..学学学..编编..编程";
               
                //1,将字符串中,去掉,用替换
                str=str.replaceAll("\\.+", "");
               
                System.out.println(str);
               
                //2,替换叠词
                str=str.replaceAll("(.)\\1+", "$1");
               
                System.out.println(str);
               
        }
}


1 个回复

倒序浏览
顶顶顶顶顶顶顶顶顶顶顶顶
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马