力扣193题:正则表达式中限定符与定位符的灵活使用

1. 思路:

题目的核心是匹配符合规则的字符串,因为规则比较单一,所以使用正则表达式来检索符合要求的字符串即可。

2. 规则分析

(xxx) xxx-xxxx 或 xxx-xxx-xxxx。(x 表示一个数字)

从规则中可以看出,只要符合上述形势的数字组合即可。

  • 分析 (xxx) xxx-xxxx

我们把其中的规律列出来,找出固定的字符位置与可变字符的规律。 

 

最终需要用正则表达式中的普通字符、特殊字符、限定符、定位符来描述对应的规律(如上图所示)

3. 使用正则表达式描述规律

表达 (xxx) xxx-xxxx

^\([0-9][0-9][0-9]\) [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$

 使用限定符来限定数字出现的次数,优化为如下表达

^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$

 

表达 xxx-xxx-xxxx

^[0-9][0-9][0-9]-[0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$

使用限定符来限定数字出现的次数,优化为如下表达

^[0-9]{3}-[0-9]{3}-[0-9]{4}$

 Note: 使用标准的POSIX表达式中未定义\d表示数字,需要使用“扩展正则”的方式才行。例如sed和grep都支持此表达方式。

同时表示xxx-xxx-xxxx和 (xxx) xxx-xxxx

使用特殊字符()|。用()来标记一个表达式,使用|来指明两项之间的任意选择。

xxx-xxx-xxxx和 (xxx) xxx-xxxx

最终表达式如下:

^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$

grep -P '^([0-9]{3}-|\([0-9]{3}\) )[0-9]{3}-[0-9]{4}$' file.txt
^:表示行首,以...开始,这里表示以(xxx) 或者xxx-开始,注意空格
():选择操作符,要么是([0-9]\{3\}) ,要么是[0-9]\{3\}-
|:或者连接操作符,表示或者
[]:单字符占位,[0-9]表示一位数字
{n}:匹配n位,[0-9]\{3\}匹配三位连续数字
$:表示行尾,结束

4. 附加快速查看表 

特殊字符转义表达特殊含义
()\(\)标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用
$\$匹配输入字符串的结尾位置
*\*匹配前面的子表达式零次或多次
+\+匹配前面的子表达式一次或多次
.\.匹配除换行符 \n 之外的任何单字符
[ ]\[\]标记一个中括号表达式的开始。要匹配 [,请使用 [。
?\?匹配前面的子表达式零次或一次,或指明一个非贪婪限定符
\\\将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符
^\^匹配输入字符串的开始位置,除非在方括号表达式中使用,当该符号在方括号表达式中使用时,表示不接受该方括号表达式中的字符集合
{}\{\}标记限定符表达式的开始
|\|

指明两项之间的一个选择                                                                               

限定符表达

Note 表含义中的出现次数:限定符前面字符的出现次数。

限定符表达含义
*出现次数>=0
+出现次数>=1
?出现次数 0 or 1, 等价{0,1}
{n}出现次数=n
{n,}出现次数>=n
{n, m}n=< 出现次数<= m

 定位符

定位符表达含义
^字符串开始的位置
$字符串结束的位置
\b限定单词(字)的字符,常用来确定一个单词,可以结合两个‘\b’使用
\B限定非单词(字)边界的字符,用的很少

转载自力扣题解,无任何盈利目的,侵权请联系删除

力扣https://leetcode-cn.com/problems/valid-phone-numbers/solution/zheng-ze-biao-da-shi-zhong-xian-ding-fu-yu-ding-we/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值