正则表达式

简单的学习一下正则表达式吧

  1. 最简单的,比如匹配matrix
    • 这样会匹配到所有含有matrix的,比如,matrix67,matrix123等
  2. \b metacharacter
    • 匹配一个位置,代表开头或者结尾
    • 比如,\bmatrix\b 就是匹配单词matrix了
  3. . 匹配除了换行符外所有的元素
  4. * 闭包
    • 比如.* 就是匹配所有不包含换行的字符串
  5. + 正闭包
    • 比如.+ 就是匹配所有不包含换行的字符串,但必须有一位,不能为空
  6. ? 匹配0次或1次
  7. \d 匹配一个数字的字符(0,1,2…,9)
    • 0\d\d-\d\d\d\d\d\d\d\d 就是匹配一个电话号码,可以简写为0\d{2}-\d{8}
  8. \s 匹配任意的空白符,空格,制表符(Tab),换行
  9. \w 匹配字母,数字,下划线,汉字等
  10. ^ 匹配字符串的开始
  11. $ 匹配字符串的结束
    • ^\d{6,9}$ 就是匹配所有6~9位的数字
  12. [] 匹配括号内的字符
    • [0-9] 就相当于\d
    • [matrix] 匹配m,a,t,r,i,x中的一个字符
    • \(?0\d{2}[) -]?\d{8} 就是匹配一个电话号码
  13. | 或者
    • 上边的匹配电话号码有问题,(011-12345678 这样的也会匹配
    • 那么可以这样修改 \(0\d{2}\)\d{8}|0\d{2}[ -]\d{8}
  14. () 分组
    • (\d{1,3}\.){3}\d{1,3} 可以是简单的匹配IP地址,可惜,666.666.666.666这样的也会被匹配进去,进一步改写 ([01]?\d\d?|2[0-4]\d|25[0-5]\.){3}[01]?\d\d?|2[0-4]\d|25[0-5] 比较难想
  15. 反义:将字母变成大写(好神奇)
    • \W 匹配任意不是字母,数字,下划线,汉字的字符
    • \S 匹配任意不是空白的字符
    • \D 匹配任意不是数字的字符
    • \B 匹配任意不是单词开始或结尾的位置
    • [^matrix] 匹配除了m,a,t,r,i,x以外的其他字符
    • <a[^>]+> 匹配尖括号内,以a开头的字符串
  16. 使用小括号指定一个子表达式后,这个子表达式的文本可以被后边所用,默认情况下,以每个左括号为标准,从1开始标号
    • \b(\w+)\b\s+\1\b 表示匹配重复的单词,比如matrix matrix等
  17. 当然也可以自己指定组名(?<name>exp) 表示的就是匹配exp的串,名字是name,捕获时候\k<name> 即可
    • 上边例子还可以写为\b(?<word>\w+)\b\s+\k<word>\b
  18. 零宽断言,用于查找某些特定串的前面或后面的内容
    • (?=exp) 查找某些串,这些串的尾部是exp,查找结果是匹配的串减去尾部部分,比如\b\w+(?=ing\b) 查找I am singing while you are dancing时,结果为sing和danc
    • (?<=exp) 查找某些串,这些串的头部是exp,查找结果是匹配的串减去头部部分,比如(?<=\bmat)\w+\b 查找I love matrix67 and matrix123是,结果为rix67和rix123
    • 比如 (?<=\s)\d+(?=\s) 表示空白符间隔的数字
  19. 负向零宽断言
    • (?!exp) 表示此位置后面不能匹配exp,比如\d{3}(?!\d) 匹配三位数字,并且这三位数字后面不是数字,比如\b((?!abc)\w)+\b 匹配不包含连续abc的单词
    • (?<!exp) 表示此位置前面不能匹配exp,(?<![a-z])\d{7} 表示前面不是小写字母的7位数字
  20. (?#comment) 添加注释
  21. 贪婪与懒惰
    • 当匹配能接受重复的串时,通常是接受最长的串,也就是贪婪匹配,比如a.*b 是匹配以a为开头,以b为结尾的所有的串,当匹配aabab时,匹配的是aabab
    • 有时候,我们希望匹配的尽可能短,可以这样a.*?b 此时再匹配时,就是匹配的aab(0,2)和ab(3,4)
    • *? 重复尽可能少的次数
    • +? 重复一次或更多次,但尽可能少
    • ?? 重复0次或一次,尽可能少
    • {n,m}? 重复n到m次,尽可能少
    • {n,} 重复至少n次,尽可能少
  22. 处理选项
    • IgnoreCase 匹配时不区分大小写
    • Multiline 多行模式,更改^, 的含义是匹配\n前的位置和字符串结束前的位置
    • Singleline 单行模式,更改.的含义,与每一个字符匹配(包括\n)
    • IgnorePatternWhitespace 忽略空白
    • ExplicitCapture 显式捕获,仅捕获被显式命名的组
  23. 递归匹配
    • (?'exp') 把捕获的内容命名为exp,并压入堆栈
    • (?'-exp') 从堆栈上面弹出最后压入的名为exp的内容,如果堆栈本来为空,匹配失败
    • (?(exp)yes|no) 如果堆栈上存在名为exp的内容,匹配yes部分的表达式,否则匹配no部分的表达式
    • (?!) 零宽负向先行断言,由于没有后缀表达式,试图匹配总是失败

至此,就对简单的正则表达式有了一定的了解了

如果遇到不会的,可以到此查找

部分内容来自deerchao

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值