正则表达式

  • 正则表达式并不关心模式在数据流中的位置。它也不关心模式出现了多少
  • 正则表达式模式区分大小写
  • 在正则表达式中,空格和其他的字符并没有什么区别

基本正则表达式

  • \ 禁止转义模式中的特殊字符

  • 特殊字符

    • \s匹配任意空白符,等价于 [ \f\n\r\t\v]
      • \S匹配非空白符
    • \w匹配数字字母下划线,等价于[A-Za-z0-9\_]
      • \W匹配非数字字母下划线
    • \d匹配数字,等价于[0-9]
  • ^ 出现在模式开头时,表示只匹配行首的模式

    • 出现在模式开头之外的其他位置,那么^就跟普通字符一样,不再是特殊字符
  • $ 出现在模式结尾时,表示只匹配行尾的模式

    • ^$模式可以匹配空白行
  • . 匹配1个字符

    • 换行符除外
    • 空白符也算字符
      • .at可以匹配 is at
    • 必须匹配一个,如果没有字符则模式不存在
      • .at不可匹配at home
  • []定义了一个字符组

    • 字符组中的任意字符出现在了数据流中,那它就匹配了该模式
    • 必须匹配字符组中的其中一个字符
    • [^]定义了排除型字符组
      • 匹配除了字符组内定义字符外的所有字符
      • 包括空白符,但仍然需要匹配到一个字符
    • 区间
      • 常用区间包括数字和字母:[1-9][a-z][A-Z]
      • 可同时置顶多个不连续区间
        • 例子:[a-ch-m],[1-36-9A-Z]
    • 特殊字符组
      在这里插入图片描述
  • *匹配 0 或多个字符

    • 放在要匹配的字符
      • 例子: echo “color” | grep -E “colou*r”
    • .*匹配任意数量的字符,包括没有字符
      • 通常用在数据流中两个可能相邻或不相邻的文本字符串之间
    • *还能用在字符组上, 指定可能在文本中出现多次的字符组或字符区间
      • 例子:grep -E “b[ae]*t”
        • 只要a和e字符以任何组合形式出现在b和t字符之间(就算完全不出现也行),模式就能够匹配
        • 如果出现了字符组之外的字符,该模式匹配就会不成立

拓展正则表达式

  • awk程序能够识别拓展模式,但sed不能

    • 因此awk更慢一些
  • ?匹配0个或1个字符

    • 与星号一样,可以将问号和字符组一起使用
      • 例子:grep -E “b[ae]?t”
        • 如果字符组中的字符出现了0次或1次,模式匹配就成立
        • 如果两个字符都出现了,或者其中一个字符出现了2次,模式匹配就不成立
  • +匹配1个或多个字符,但至少出现1次

    • 加号同样适用于字符组,与星号和问号的使用方
      式相同
  • {}允许为可重复的模式指定上限

    • {m}表示模式精确出现m次
    • {m,n}表示模式会出现m-n次之间
    • {m,}表示模式至少出现m次
    • 默认awk程序不会识别正则表达式间隔;必须指定gawk程序的--re- interval
      命令行选项才能识别
  • |用逻辑OR方式匹配的两个或多个模

    • 表达式和管道符号之间不能有空格,否则它们也会被认为是正则表达式模式的一部分
  • ()进行分组

    • 该组会被视为一个标准字符。可以像对普通字符一样给该组使用特殊字符
    • 匹配Saturday或者缩写Sat:grep -E "Sat(urday)?"
    • cat和tab都可以匹配: (c|b)a(b|t)

例子

# 匹配Saturday或者缩写Sat
Sat(urday)?
# 函数名不得以数字开头
^[^0-9]
# (不以0开头的)正整数
^[1-9][0-9]*
# 1-999的正整数
^[1-9][0-9]{1,3}
# txt后缀的文件
\.txt$
# 空行
^\s*$

# 用户注册表单时,只允许密码包含字符、数字、下划线和连接字符(-),并设置密码的长度区间为6-15
^[1-9a-zA-Z_\-]{6-15}$
# 中文字符串
^[\\u4e00-\\u9fa5]{0,}$
# 日期
^(?:(?!0000)[0-9]{4}-(?:(?:0[1-9]|1[0-2])-(?:0[1-9]|1[0-9]|2[0-8])|(?:0[13-9]|1[0-2])-(?:29|30)|(?:0[13578]|1[02])-31)|(?:[0-9]{2}(?:0[48]|[2468][048]|[13579][26])|(?:0[48]|[2468][048]|[13579][26])00)-02-29)$
# 内网IP(包括IPV6)
^(^127\\.)|(^192\\.168\\.)|(^10\\.)|(^172\\.1[6-9]\\.)|(^172\\.2[0-9]\\.)|(^172\\.3[0-1]\\.)|(^::1$)|(^[fF][cCdD])$
# 从文本中提取URL链接
^(f|ht){1}(tp|tps):\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- ./?%&=]*)?

shell通配符

  • *匹配 0 或多个字符
  • ?匹配任意一个字符
  • [list] 匹配 list 中的任意单一字符
  • [!list] 匹配 除list 中的任意单一字符以外的字符
  • [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z]
  • {string1,string2,...} 匹配 string1 或 string2 (或更多)其一字符串
  • {c1..c2} 匹配 c1-c2 中全部字符 如{1…10}

参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值