Java 正则表达式详解

符号定义

基本书写符号
符号 名称 示例 解释 匹配输出
\ 转义符 \* 符号“*” *
[ ] 可接收的字符列表 [abc] a/b/c 中的任意一个字符 a/b/c
[^] 不接收的字符列表 [^abc] 除a/b/c之外的任意1个字符,包括数字和特殊符号 d/e/3
| 匹配“|”之前或之后的表达式 ab|cd ab或cd ab/cd
( ) 将子表达式分组 (abc) 将字符串abc作为一组 abc
- 连字符 0-9a-z 任意单个小写字母或数字 小写字母/数字
限定符
符号 含义 示例 解释
* 指定字符重复0次或n次 (abc)* 仅包含任意个abc的字符串,等效于\w*
+ 指定字符重复1次或n次 m+(abc)* 以至少1个m开头,后接任意个abc的字符串
? 指定字符重复0次或1次 m+abc? 以至少1个m开头,后接ab或abc的字符串
{n} 只能输入n个字符 [abcd]{3} 由abcd中的字母组成的任意长度为3的字符串
{n,} 指定至少n个匹配 [abcd]{3,} 由abcd中的字母组成的任意长度不小于3的字符串
{n,m} 指定至少n个但不多于m个匹配 [abcd]{3,} 由abcd中的字母组成的任意长度不小于3,且不大于5的字符串
^ 指定起始字符 ^[0-9]+[a-z]* 以至少1个数字开头,后接任意个小写字母的字符串
$ 指定结束字符 ^[0-9]-[a-z]+$ 以1个数字开头后接"-",并以至少1个小写字母结尾的字符串
匹配字符集
符号 含义 示例 解释
. 匹配除 \n 以外的任何字符 a..b 以a开头,b结尾,中间包括2个任意字符的长度为4的
\d 匹配单个数字字符,相当于[0-9] \d{3}(\d)? 包含3个或4个数字的字符串
\D 匹配单个非数字字符,相当于[^0-9] \D(\d)* 以单个非数字字符开头,后接任意个数字字符串
\w 匹配单个数字、大小写字母字符,相当于[0-9a-zA-Z] \d{3}\w{4} 以3个数字字符开头的长度为7的数字字母字符串
\W 匹配单个非数字、大小写字母字符,相当于[^0-9a-zA-Z] \W+\d{2} 以至少1个非数字字母字符开头,2个数字字符结尾的字符串
分组构造

常用分组构造形式:

  • () 非命名捕获。捕获匹配的子字符串(或非捕获组)。编号为零的第一个捕获是由整个正则表达式模式匹配的文本,其它捕获结果则根据左括号的顺序从1开始自动编号。
  • (?<name>) 命名捕获。将匹配的子字符串捕获到一个组名称或编号名称中。用于name的字符串不能包含任何标点符号,并且不能以数字开头。可以使用单引号替代尖括号,例如 (?'name')
字符转义
  • 如果你想查找元字符本身的话,比如你查找.,或者*,就出现了问题:你没办法指定它们,因为它们会被解释成别的意思。这时你就得使用\来取消这些字符的特殊意义。因此,你应该使用.和*。当然,要查找\本身,你也得用\
  • 例如:deerchao.net匹配deerchao.NET,C:\Windows匹配C:\Windows。
    注意在Java中: (https://github\.com/[\w\-]) 用"\."配备"."。

常用正则表达式举例

规则描述 表达式
非负整数 "^\d+$ "
正整数 "^ [0 - 9] * [1 - 9] [0-9] * $"
非正整数 "^( (-\d+) | (0+) ) $"
整数 "^-?\d+$"
英文字符串 "^[A-Za-z]+$"
英文字符数字串 "^[A-Za-z0-9]+$"
英数字加下划线串 "^\w+$"
E-mail地址 "^[ \w - ] + ( \ . [\w-]+) * @ [\w-]+( \ . [\w-]+)+$"
URL "^[a-zA-Z]+:// ( \w + ( - \w +) * ) ( \ . ( \w+(-\w+) * )) * ( \ ? \ s * ) ? $"

JAVA正则表达式Pattern和Matcher

Pattern是一个正则表达式经编译后的表现模式,而Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。 如果要详细了解这2个类如何操作正则表达式,请看pattern类详解matcher类详解。下面用几个例子说明在java中如何利用正则表达式进行字符串操作。

对QQ号码进行校验
//对QQ号码进行校验; 需求:长度为5~15,不能以0开头,全都为数字;  
public static void checkQQ_1() //使用正则表达式操作;  
{
    String QQ = "164a35464165";
    String QQReg = "[1-9]\\d{4,14}";
    boolean checkResult = QQ.matches(QQReg);
    if (checkResult) System.out.println("QQ :" + QQ);
    else System.out.println("非法QQ!!!");
}
字符串操作替换
public static void main(String[] args) {
    /* 为了让规则的结果可以被重用,可以将规则封装成一个组,用()来完成。组的出现都有编号。 
        编号从1开始,要想使用已有的组,可以通过\n(n就是组的编号)的形式来获取。*/
    String str1 = "dfhk6426543541sdfg4565263dggr123456789";
    replaceAllDemo(str1, "\\d{5,}", "*"); //将数字替换成*;  
    String str = "kjsdffjeihgglsjssskfjkkklc";
    replaceAllDemo(str, "(.)\\1+", "$1"); //将重叠的字符替换成单个字符;替换结果:kjsdfjeihglsjskfjklc  
}

public static void replaceAllDemo(String str, String reg, String newStr) {
    str = str.replaceAll(reg, newStr);
    System.out.println(str);
}
字符串操作切割
public static void main(String[] args) {
    splitDemo("java01  java02 java03    java04", " +"); //" +"是按照多个空格来切割;  
    splitDemo("D:\\mytest\\day225\\RegexDemo.java", "\\\\");
    splitDemo("kjsdffjeihgglsjssskfjkkklc", "(.)\\1+"); //按照叠词切割;  
}
public static void splitDemo(String str, String reg) {
    String[] arr = str.split(reg);
    for (String s: arr) {
        System.out.println(s);
    }
}
字符串操作查找
public static void getDemo() {
    String str = "ming tian jiu yao fang jia le, da jia.";
    String reg = "\\b[a-z]{4}\\b";
    //将规则封装成对象;  
    Pattern p = Pattern.compile(reg);
    //让正则对象和要操作的字符串相关联;  
    Matcher m = p.matcher(str);

    //m.find():将规则作用到字符串上,并进行符合规则的字串查找;  
    while (m.find()) {
        System.out.println(m.group());
        System.out.println(m.start() + "---" + m.end()); //获取找到字串的始末索引(包含头,不包含尾);  
    }
}
字符串包含验证
//查找以Java开头,任意结尾的字符串
Pattern pattern = Pattern.compile("^Java.*");
Matcher matcher = pattern.matcher("Java不是人");
boolean b= matcher.matches();
//当条件满足时,将返回true,否则返回false
System.out.println(b);
例子
//正则表达式测试
public class MatcherTest {
    public static void main(String[] args) throws Exception {
        //生成Pattern对象并且编译一个简单的正则表达式"Kelvin"   
        Pattern p = Pattern.compile("Kelvin");
        //用Pattern类的matcher()方法生成一个Matcher对象   
        Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company");
        StringBuffer sb = new StringBuffer();
        int i = 0;
        //使用find()方法查找第一个匹配的对象   
        boolean result = m.find();
        //使用循环将句子里所有的kelvin找出并替换再将内容加到sb里   
        while (result) {
            i++;
            m.appendReplacement(sb, "Kevin");
            System.out.println("第" + i + "次匹配后sb的内容是:" + sb);
            //继续查找下一个匹配对象   
            result = m.find();
        }
        //最后调用appendTail()方法将最后一次匹配后的剩余字符串加到sb里;   
        m.appendTail(sb);
        System.out.println("调用m.appendTail(sb)后sb的最终内容是:" + sb.toString());
    }
}
执行结果
第1次匹配后sb的内容是:Kevin 
第2次匹配后sb的内容是:Kevin Li and Kevin 
第3次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin 
第4次匹配后sb的内容是:Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin 
总结
  1. 搜索(匹配):在一个字符串中搜索出一个或多个与正则表达式相匹配的子字符串。搜索又分为匹配和子字符串搜索。匹配是对用户所提供的整个字符串进行判断,看其是否匹配正则表达式,比如电子邮件地址的匹配。子字符串搜索是“搜索”的普遍含义,指的是将与正则表达式相匹配的所有子字符串找出来,比如将一段英文文本中的所有单词给找出来。

  2. 替换(匹配并替换):将一个字符串中与正则表达式相匹配的子字符串找出来并替换成另一些子字符串,比如将一个字符串中的所有的cos替换成sin。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,752评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,100评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,244评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,099评论 1 286
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,210评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,307评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,346评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,133评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,546评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,849评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,019评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,702评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,331评论 3 319
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,030评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,260评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,871评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,898评论 2 351

推荐阅读更多精彩内容

  • 1. 正则表达式 1.1 什么是正则表达式 正则表达式: 定义一个搜索模式的字符串。 正则表达式可以用于搜索、编辑...
    __元昊__阅读 503评论 0 0
  • 1. 正则表达式 1.1 什么是正则表达式 正则表达式: 定义一个搜索模式的字符串。 正则表达式可以用于搜索、编辑...
    数据萌新阅读 507评论 0 1
  • 正则表达式用于指定字符串的模式,你可以任何需要定位使用匹配某种特定模式的字符串的情况下使用正则表达式 jdk1.4...
    Moonsmile阅读 427评论 2 0
  • 正则表达式乍一看上去是一堆繁琐的、无规律的、令人头大的字符串,但是当你了解他之后,你就会知道它的强大。很多程序设计...
    iDaniel阅读 2,581评论 1 18
  • 正则表达式描述的是一种规则,符合这种限定规则的字符串我们认为它某种满足条件的,是我们所需的。在正则表达式中,主要有...
    Single_YAM阅读 742评论 0 4