轻松入门正则表达式

172 阅读4分钟

​文章背景

  • 对于正则表达式,相信很多开发者在进行一些特殊的文本处理或者日常排查日志中会使用到。
  • 今天就通过一个实战带大家轻松入门正则表达式。
  • 让我们直接开始练习吧
  • 首先准备练习文本,这份文档是从网上改编而来,我们可将其命名为test.txt,
Football game is not use feet only.
this dress doesn't fit me.
GNU is free air not free beer.
Her hair is very beauty.
I can't finish the test.
Oh! The soup taste good.
Test tool

通过grep来使用正则表达式

  • 本篇文章将介绍
    • grep 命令
    • 行首行尾符
    • 任意和重复字符
    • 限定连续字符范围
    • 字符组匹配
    • 正则表达式特殊符号
    • 正则中贪婪模式和非贪婪模式的区别
  • grep命令
  • 常用参数说明
    • -c :计算符合规则的字符串个数
    • -i :忽略大小写的差别
    • -n :带行号输出
    • -v :反向查找,显示不符合规则内容的行
grep -c 'test' test.txt
grep -n 'test' test.txt
grep -in 'test' test.txt

grep -vn 'test' test.txt

  • 行首行尾符
    • 行首符 ^ 与行尾符 $

    • 当查找含有GNU开头的字符串时,则可以使用以下命令

      grep -n '^GNU' test.txt
      

  • 任意和重复字符
    • 可以用任意字符.与重复字符*来查找s?u?类型的字符

      grep -n 's.u.' test.txt
      

   

小数点.表示任意一个字符
*(星号):代表重复前面 0 个或者多个字符。
s*:表示具有空字符或者一个以上 s 字符。
ss*,表示前面的第一个 s 字符必须存在。第二个 s 则可以是 0 个或者多个 s 字符。
sss*,表示前面两个 s 字符必须存在。第三个 s 则可以是 0 个或者多个 s 字符。
ss*s :表示前面的第一个与第三个 s 字符必须存在。第二个 s 则可以是 0 个或者多个 s 字符。
grep -n 's*' test.txt
grep -n 'oo*' test.txt

  • 限定连续字符范围
    • 此处需要注意的是用到了转义字符``

    • 限定连续字符范围{}

    • { } 可限制一个范围区间内的重复字符数。如果现在要求找出存在连续的两个 e 字符的字符串,根据前面所学的知识,我们可以使用:

      grep -n 'ooo*' test.txt
      
    • 第2种方法便是使用{}

      grep -n 'o{2}' test.txt

  • 字符组匹配
    • []可以用来匹配字符组
    • []里无论是使用多少个字符,它只代表一个,比如我们想查找useme这两个?e格式
grep -n '[sm]e' test.txt

[^] 为反向选择字符组,用于排除后面的字符,使用方式为 [^...]。它和参数-v区别在于-v只会输出不含有反向选择的字符的行。

grep -nv 'eet' text.txt
grep -n '[^eet]' test.txt

其他使用例子

[abc]           :表示 “a” 或 “b” 或 “c[0-9]           :表示 0~9 中任意一个数字,等价于 [0123456789]-代表着是一个范围
[^abc]         :表示除 “a”、“b”、“c” 外的其它任意一个字符
[^A-Z]         :表示除大写字母外的任意一个字符
  • 正则表达式特殊符号

    [:xdigit:]代表 16 进位的数字类型
    [:alpha:]代表英文大小写字母
    [:alnum:]代表英文大小写字母及数字
    [:digit:]代表数字
    [:lower:]小写字母
    [:upper:]代表大写字母
    [:blank:]代表空格和 tab 键
    [:cntrl:]键盘上的控制按键,如 CR,LF,TAB,DEL
    [:print:]可以被打印出来的任何字符
    [:punct:]代表标点符号
    [:space:]任何会产生空白的字符如空格,tab 等
    
  • 正则中贪婪模式和非贪婪模式的区别
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,通俗说法就是匹配范围的大小。
贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配。
非贪婪模式(懒惰模式)在整个表达式匹配成功的前提下,尽可能少的匹配。
{m,n}、{m,}、?、* 和 +。属于贪婪模式,但是在后面加上?就变成了非贪婪模式。如,“{m,n}?”这个就属于非贪婪模式

贪婪模式
"123456abc";
/\d{1,3}/;

非贪婪模式?
"123456abc";
/\d{1,3}?/;

今天就和大家介绍到这了,欢迎关注我的微信公众号【那未明】来聊聊!