怎么样书写正则表达式呢?
我们写正则表达式,都是从分析匹配字符串特点开始,然后逐步补充其它元字符,普通字符。匹配从左到右。
例如:我们要匹配一个手机号码。
1. 分析字符串特点,手机号码是数字,并且是以1开头,11位长
2.可以写”1\d” 1开头,后面跟着数字 也可以是:1[0-9]
3.数字长度是11位 ,继续补充1\d{10} ,后面数字长11字符,也可以是:1[0-9]{10} ;{}里面数字,表示它左边字符可以重复出现次数
4.所有字符必须是11位,因此头尾直接必须满足条件,因此可以是:^1\d{10}$ 了。
例如:我们匹配QQ号码
1.分析QQ号码特点是,号码是 最少是5位数,首位字符非0,最大长度,目前到11位了
2.可以先定义首位字符,[1-9]\d 首位字符是1到9,后面是字符
3.后面字符个数在4到10位 [1-9]\d{4,10}
4.所有字符串必须都满足上面匹配,因为可以写成:^[1-9]\d{4,10}
例如:匹配IP地址
1.分析ip结构是,每节 0-255,中间用”.”分割,一共有4节
2.首先我们写第一个0-255 ,可以分解为0-9 一位数,10-99两位数,100-199三位数,200-249三位数第2节,250-255第四节
[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5] “|”表示或者,计算优先级最低,左右两边可以是多个元字符普通字符组合字符串为一个整体。
3.这样的字符,有三次重复,中间加”.” ,所以结果是:
[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5]\. ,因为是点字符是元字符,所有需要转义。这样是不是可以了呢,我们发现有问题,”|”优先级最低,这样会把最后\.字符表,组合为:“25[0-5] \.”了。因此,应该是前面几种情况,后面跟个”.”字符,正确是:([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\. ,这样就达到要求了。我们会发现,实际上每家一个()字符,都一个子匹配,会在匹配结果里面出现()内容。这里我们加()目的是,让优先计算,因此不需要里面子匹配内容。我们可以加忽略子匹配内容字符:?: ,结果将变为:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.
4.一段已经匹配到了,然后我们这样需要重复三次,我们可以直接重复上一个表达式3次:
方法一:(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.(?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.
方法二:把第一段作为分组,重复3次 ((?:[0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3} ,然后同样忽略子匹配结果,可以变为: