Java正则表达式

导语

所有的开发一定要有正则的支持。

主要内容

  • 记下常用的正则标记
  • 掌握String类对正则的支持

具体内容

问题引出

为了更好的说明正则的应用,下面要求编写一个程序:判断一个字符串是否由数字所组成。
实现原理:

  • 将字符串变为字符数组。
  • 而后判断每一个字符是否在“‘0’~‘9’”范围之间。

范例:实现字符串的判断

public class TestDemo {
    public static void main(String args[]) {
        String str1 = "123";
        System.out.println(isNumber(str1));
        String str2 = "1a23";
        System.out.println(isNumber(str2));
    }
    public static boolean isNumber(String temp) {
        char data [] = temp.toCharArray();  // 将字符串变为字符数组,目的是循环取出
        for(int i = 0; i < data.length; i++) {
            if(data[i] > '9' || data[i] < '0') {
                return false;
            }
        }
        return true;
    }
}

输出结果

true
false

此时判断字符串是否由数字所组成,是一个很容易实现的功能,但是就这样一个简短的操作,却写出了八行代码,那么如果说现在是更加复杂的操作呢?

范例:更简单的做法

public class TestDemo {
    public static void main(String args[]) {
        String str1 = "123";
        System.out.println(str1.matches("\\d+"));
        String str2 = "1a23";
        System.out.println(str2.matches("\\d+"));
    }
}

输出结果

true
false

一个写了很多行的代码,最后只是写了一行简单的操作就实现了,而其中出现的"\d+"就是正则表达式。

正则是从JDK1.4的时候正式引入到java中的工具类,所有正则支持的类都定义在java.util.regex包里面。在JDK1.4之前,如果想要使用正则,则需要单独下载一个正则表达式的开发包后才可以使用。

在java.util.regex包里面主要定义了两个主要的类:

  • Pattem类:此类对象如果要想取得必须使用compile()方法,方法的功能是编译正则。
  • Matcher类:通过Pattem类取得。

正则标记(背会)

所有的正则可以使用的标记都在java.util.regex.Pattem类里面定义。

  • 单个字符(数量:1)。
    • 字符:表示由一位字符所组成:"x"
    • \:表示转义字符“\”。
    • \t:表示一个“\t”符号。
    • \n:匹配换行“\n”符号。
  • 字符集(数量:1).
    • [abc]:表示可能是字符a或者是字符b或者是字符c中的任意一位。
    • [^abc]:表示不是a、b、c中的任意一位。
    • [a-z]:所有的小写字母。
    • [a-zA-Z]:所有的字母(不区分大小写)。
    • [0-9]:任意一位数字。
  • 简化的字符集表达式(数量:1)。
    • .:表示任意的一位字符。
    • \d:等价与“[0-9]”,属于简化写法。
    • \D:等价与“[^0-9]”,也属于简化写法。
    • \s:表示任意的空白字符,例如:“\t”、“\n”。
    • \S:表示任意的非空白字符。
    • \w:等价于“[a-zA-Z_0-9]”,表示由任意的字母、数字、_所组成。
    • \W:等价于“[^a-zA-Z_0-9]”,表示不是由任意的字母、数字、_所组成。
  • 边界匹配(不要在java中使用,在JavaScript里使用)。
    • ^:正则的开始。
    • $:正则的结束。
  • 数量表达式
    • 正则?:表示此正则可以出现0次或1次。
    • 正则+:表示此正则可以出现1次或1次以上。
    • 正则*:表示此正则可以出现0次、1次或多次。
    • 正则{n}:表示此正则正好出现n次。
    • 正则{n,}:表示此正则出现n次及以上(包含n次)。
    • 正则{n,m}:表示此正则出现n次~m次。
  • 逻辑运算。
    • 正则1 正则2:正则1判断完成之后继续判断正则2。
    • 正则1 | 正则2:正则1或者是正则2有一组满足即可。
    • (正则):将多个正则作为一组,可以为这一组单独设置出现的次数。

范例:使用正则表达式

public class TestDemo {
    public static void main(String args[]) {
        String str = "a";
        System.out.println(str.matches("a"));  // true
        System.out.println(str.matches("b"));  // false
        System.out.println(str.matches("[abc]"));  // true
        System.out.println(str.matches("[xyz]"));  // false
        System.out.println(str.matches("[^abc]"));  // false
        System.out.println(str.matches("[^xyz]"));  // true
        System.out.println(str.matches("[a-z]"));  // true
        System.out.println(str.matches("[A-Z]"));  // false

        str = "123";
        System.out.println(str.matches("\\d"));  // false
        System.out.println(str.matches("\\d+"));  // true
    }
}

输出结果

true
false
true
false
false
true
true
false
false
true

String类对正则的支持(重点)

在JDK1.4之后,由于正则的引入,所以String类里面也相应的增加了新的操作方法支持:

  • public boolean matches(String regex):正则验证,使用指定的字符串判断其是否符合给出的正则表达式结构。
  • public String replaceAll(String regex, String replacement):全部替换。
  • public String replaceFirstl(String regex, String replacement):替换首个。
  • public String[] split(String regex):全部拆分。
  • public String[] split(String regex, int limit):部分拆分。

范例:实现字符串的替换

public class TestDemo {
    public static void main(String args[]) {
        String str = "klslkasjfALFJfiwq029342()*$;klja#AD";
        String regex = "[^a-z]";  // 此处编写正则
        System.out.println(str.replaceAll(regex, ""));
    }
}

输出结果

klslkasjffiwqklja

范例:实现字符串的拆分

public class TestDemo {
    public static void main(String args[]) {
        String str = "kj8LK89ssL8798KLLKlkllk5555ww";
        String regex = "\\d+";  // [0-9]
        String result [] = str.split(regex);
        for(int i = 0; i < result.length; i++) {
            System.out.println(result[i]);
        }
    }
}

输出结果

kj
LK
ssL
KLLKlkllk
ww

所有正则之中最应该引起我们兴奋的事情是因为可以使用它进行验证。

范例:验证一个字符串是否是数值

public class TestDemo {
    public static void main(String args[]) {
        String str = "10.2";
        String regex = "\\d+(\\.\\d+)?";
        System.out.println(str.matches(regex));
    }
}

输出结果

true

范例:验证一个字符串是否是邮箱

public class TestDemo {
    public static void main(String args[]) {
        String str = "hello.nihao123_123@mldn.com.cn";
        String regex = "[a-zA-Z][a-zA-Z0-9_\\.]{0,28}[a-zA-Z0-9]@\\w+\\.(net|cn|com|com\\.cn|org|gov|edu)";
        System.out.println(str.matches(regex));
    }
}

输出结果

true

java.util.regex包支持

在大多数情况下使用正则的时候都会采用String类完成,但是正则最原始的开发包是java.util.regex,这个包里也提供有两个类。

范例:Pattem类

public class TestDemo {
    public static void main(String args[]) {
        String str = "a1b22c333d4444e55555";
        String regex = "\\d+";
        Pattern pattren = Pattern.compile(regex);  // 编译正则
        String result [] = pattern.split(str);  // 拆分字符串
        System.out.println(Arrays.toString(result));
    }
}

输出结果

[a,b,c,d,e]
public class TestDemo {
    public static void main(String args[]) {
        String str = "24123";
        String regex = "\\d+";
        Pattern pattren = Pattern.compile(regex);  // 编译正则
        Matcher mat = pattern.matcher(str);  // 进行正则匹配
        System.out.println(mat.matches());  // 匹配结果
    }
}

输出结果

true

因为String类本身就已经支持这样的操作了,所以对于String类而言由于所有接收的数据也都是字符串,所以很少会去利用Pattem与Matcher两个类进行操作了。

总结

  • 利用正则实现验证代码可以最少化。
  • 一定要清楚String类对正则支持的几个方法。

更多内容戳这里(整理好的各种文集)

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

推荐阅读更多精彩内容

  • Java的正则表达式讲解:(为了能看清,本文正则表达式用中文的句号代替英文句点) 英文句点符号:匹配单个任意字符。...
    红姑娘阅读 4,314评论 0 2
  • package com.fsti.icop.util.regexp; import java.util.regex...
    请叫我木头哥阅读 1,026评论 0 0
  • 14.01_常见对象(正则表达式的概述和简单使用) A:正则表达式是指一个用来描述或者匹配一系列符合某个语法规则的...
    苦笑男神阅读 645评论 0 0
  • 今天,我去了极地海洋世界。那是一个非常好玩的地方。 一进门,正好赶上了时间,我就先去看了动物表演。海豚们聚...
    wuzixuan2008阅读 200评论 0 1
  • 猫叔今日分享图书《TED演讲的秘密-18分钟改变世界》,晨读内容请关注猫叔第二个公众号“剽悍晨读”,每天进...
    沙枣花zyh阅读 257评论 1 1