正则表达式01

运维人生  ·  2020-11-25

正则表达式教程

正则表达式(Regular Expression)是一种强大的文本处理工具,用于匹配、查找和替换字符串中的模式。本教程将介绍正则表达式的基础知识和常用技巧。

1. 基本概念

正则表达式是由普通字符(如字母a-z)和特殊字符(称为"元字符")组成的文本模式。

2. 基本匹配

  • 普通字符:匹配自身,如 a 匹配字母"a"
  • 特殊字符:需要转义才能匹配自身,如 \. 匹配点号

3. 常用元字符

字符类

  • . - 匹配任意单个字符(除换行符外)
  • [abc] - 匹配a、b或c中的任意一个
  • [^abc] - 匹配除了a、b、c以外的任意字符
一些特殊需求
[\d] 只匹配 \ 和d两个字符
[[a] 匹配[ 时必须放到[之后
[a-] 匹配-时必须放到]之前

量词

  • * - 匹配前一个元素0次或多次
  • + - 匹配前一个元素1次或多次
  • ? - 匹配前一个元素0次或1次
  • {n} - 匹配前一个元素恰好n次
  • {n,} - 匹配前一个元素至少n次
  • {n,m} - 匹配前一个元素n到m次

位置锚点

  • ^ - 匹配字符串的开始
  • $ - 匹配字符串的结束
  • \b - 匹配单词边界
  • \B - 匹配非单词边界
  • \< - 表示一个单词的起始
  • \> - 表示一个单词的结尾

分组和引用

  • ( ) - 捕获分组
  • (?: ) - 非捕获分组
  • \n - 引用第n个捕获组(n为数字)

选择

  • | - 或操作,匹配左边或右边的表达式

元字符

元字符描述
\d匹配数字(等价于[0-9])
\D匹配非数字
\w匹配单词字符(字母、数字、下划线)
\W匹配非单词字符
\s匹配空白字符(空格、制表符、换行符等)
\S匹配非空白字符

POSIX 字符类

POSIX字符类描述字符
[:alnum:]所有的字母和数字== [:word:] == [a-zA-Z0-9]
[:word:]同[:alnum:]
[:alpha:]所有的字母== [a-zA-Z]
[:blank:]所有呈水平排列的空白字符空格、制表符
[:cntrl:]所有的控制字符[\x00-\x1F\x7F]
[:digit:]所有的数字
[:graph:]所有的可打印字符,非空格、控制字符[\x21-\x7E] '[:alnum:]' and '[:punct:]'
[:lower:]所有的小写字母
[:print:]所有的可打印字符,包括空格'[:alnum:]', '[:punct:]', and space.
[:punct:]所有的标点字符! " # $ % & ' ( ) * + , - . / : ; < = > ? @ [ \ ] ^ _ ` ~ { } ~ \
[:space:]所有呈水平或垂直排列的空白字符(新行,空格,制表符)
[:upper:]所有的大写字母
[:xdigit:]所有的十六进制数[A-Fa-f0-9]
[:ASCII:]ASCII集合== [\x00-\x7F]
实际使用: [[:alnum:]] #需要两个[[]]
[^[:alnum:]] #取反

4. 高级特性

贪婪与懒惰匹配

默认是贪婪的,在量词后加?变为懒惰
  • .* - 贪婪匹配
  • .*? - 懒惰匹配

零宽断言

  • (?=exp) - 正向前瞻
  • (?!exp) - 负向前瞻
  • (?<=exp) - 正向后顾
  • (?<!exp) - 负向后顾
1. 零宽度正预测先行断言(?=exp),  所取字符串后匹配exp  
断言自身出现的位置的后面能匹配表达式exp。  
\b\w+(?=ing\b),匹配以ing结尾的单词的前面部分(除了ing以外的部分),
如查找I'm singing while you're dancing.时,它会匹配sing和danc。

# echo "I'm singing while you're dancing."|grep -Po '\b\w+(?=ing\b)'
sing
danc

2. 零宽度正回顾后发断言(?<=exp) , 所取字符串后匹配exp
断言自身出现的位置的前面能匹配表达式exp。
(?<=\bre)\w+\b会匹配以re开头的单词的后半部分(除了re以外的部分),
如在查找reading a book时,它匹配ading。


3. 零宽度负预测先行断言(?!exp)  
断言此位置的后面不能匹配表达式exp 
\d{3}(?!\d)匹配三位数字,而且这三位数字的后面不能是数字;
\b((?!abc)\w)+\b匹配不包含连续字符串abc的单词

4. 零宽度负回顾后发断言(?<!exp)
断言此位置的前面不能匹配表达式exp
(?<![a-z])\d{7}匹配前面不是小写字母的七位数字。
 
评论
Glab. All Rights Reserved. Theme Jasmine by Kent Liao.