正则表达式

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正则表达式相关的知识,希望对你有一定的参考价值。

正则表达式一般用于索引字符串中满足特定规则的子串,或用于匹配判断指定字符串是否满足某种规则,比如校验手机号,身份证号等是否满足格式,网络爬虫中过滤url链接,等等。

1. 常见规则

[]:方括号中的字符任选其一

    [abc]:可以出现一个字符a,b或c
    
    [a-z]:可以出现任何一个英文小写字母
    
    [a-z0-9A-Z]:可以出现任意一个数字或字母

?:左边的内容出现0-1次

    [a-z]?:出现一次或0次的任意一个小写字母
    
*:左边的内容出现任意次

    [a-z]*:任意个小写字母
    
+:左边的内容出现最少一次

    [a-z]+:最少一个小写字母
    
{n}:左边内容出现n次

    [a-z]{3}:必须3个小写字母
    
{n, m}:左边内容出现n到m次

    [a-z]{2, 3}:出现2到3个小写字母
    
{n, }:左边内容出现至少n次

    [a-z]{2, }:出现最少2次

.:代表任意一个字符,如果要表示这个点,则需要转义,前面添加反斜杠,即\.

    .*:任意个任意字符
    
^:表示限制开头,在[]中使用表示非操作

    ^abc.*:匹配以abc开头的字符串

    [^abc]:可以出现一个字符,但不能a,b或c
    
    [a-z&&[^c-f]]:可以出现任意一个小写字母,但不能是cdef
    
$:表示限制结尾

    .*abc$:匹配以abc为结尾的字符串
    
():把括号中的内容看成一个整体

    (aa|bb)?:aa或bb两者任选其一

\d:任意一个数字,相当于[0-9]

\D:任意一个非数字,相当于[^0-9]

\s:任意一个空白字符,包含空格,\n等特殊字符

\S:任意一个非空白字符

\w:任意一个单词字符,数字字母下划线,相当于[0-9a-zA-Z_]

\W:任意一个非单词字符

\t:tab符

\n:换行符

\r:回车符

 2. 常用正则

手机号码:^1[3|4|5|8][0-9]\d{8}$

身份证号:^(\d{6})(18|19|20)?(\d{2})([01]\d)([0123]\d)(\d{3})(\d|X|x)?$

一个或多个汉字:^[\u0391-\uFFE5]+$

数字,字母,下划线:^[a-zA-Z0-9_]+$

3. Java实现匹配和查找

注意:(1) 和 (2) 步骤不能同时使用,(1) 步骤会将下一个匹配项移除出匹配结果集,这时 (2) 步骤就无法获取到第一个匹配的结果

public class Test {
	public static void main(String[] args) {
		String str = "abc|dd";

		// 匹配规则,Pattern.CASE_INSENSITIVE表示大小写不敏感,如果没有此参数,则大小写敏感
		Pattern p = Pattern.compile("[a-z]+", Pattern.CASE_INSENSITIVE);

		// 匹配结果,其中维护着一个结果集,可以通过find和group来获取所有结果集
		Matcher m = p.matcher(str);

		// (1) 是否匹配,匹配返回true,不匹配返回false
		boolean b = m.matches();
		
		// (2) 遍历查找所有匹配的子项,注意先find,然后在获取匹配项
		while(m.find()){
			// 获取到匹配的子字符串
			String matchStr = m.group();
		}
	}
}

4. 总结

常规开发中正则使用并非频繁,且目前网上也有不少已经写好的匹配规则,基本需要时即可查找到,还有一些更复杂的正则规则文章中并没有提及,需要时再去了解即可,能够做到熟练掌握基本语法基本能够满足开发需要。

以上是关于正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

markdown 正则表达式模式片段

正则表达式匹配特定的 URL 片段而不是所有其他 URL 可能性

循环通过 python 正则表达式匹配

asp.net 使用正则表达式验证包含打开/关闭括号片段的属性字符串

攻破难啃的骨头-正则表达式(转)

正则表达式的贪婪和非贪婪模式