1 Star 0 Fork 11

coder_lw / wiki

forked from deepinwiki / wiki 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
正则表达式.md 3.44 KB
一键复制 编辑 原始数据 按行查看 历史
htqx 提交于 2022-08-06 17:20 . 提交一些本地内容

[TOC]

正则表达式

前言

正则表达式是对文本进行处理的工具。它很酷,不过不好理解。它能够用极其精简的语言来描述我们对文本的处理任务。但是不好阅读。

不管怎么说,它几乎是所有编程语言,和相关文本工具,所采用的标准文本处理方法。因此有必要学习它。

linux 中的正则表达式,一般有两种:

  1. 基本正则表达式
  2. 扩展正则表达式

很多工具默认支持基本的正则表达式,但是可以通过选项开启扩展正则表达式。

常见工具支持情况

  1. grep:默认支持基本,-E 支持扩展,-P 支持预查和回顾
  2. sed:支持基本,-r 或 -E 支持扩展
  3. awk:支持扩展
  4. perl:全功能
  5. ruby:全功能
  6. js:全功能

规则

基本正则表达式

匹配字符

  1. .:单个字符
  2. []: 括号范围内的单个字符
  3. [^]:不再括号范围内的单个字符
  4. [:name:]:预定义的字符集合
    1. [:alnum:]: 数字和字母
    2. [:alplha:]:字母
    3. [:upper:]:大写字母
    4. [:lower:]:小写字母
    5. [:blank:]:空格和制表符
    6. [:space:]:空白符
    7. [:cntrl:]:非打印字符
    8. [:digit:]:数字
    9. [:xdigit:]:十六进制数字
    10. [:graph:]: 可打印字符的非空白符
    11. [:print:]:可打印字符
    12. [:pkunct:]:标点符号

次数

  1. *:匹配 0 到 n 次,贪婪模式,即接下来的字符匹配,会被归为一次匹配
  2. \?:0 次到 1 次
  3. \+:1 次到 n 次
  4. \{x\}: x 次
  5. \{x,y\}:至少 m 次,最多 y 次

位置

  1. ^:行首
  2. $:行尾,例子:^$ 空行
  3. \<:单词词首
  4. \>:单词词尾

分组和引用

  1. \(str\):(和)之间是一个正则分组,它也是一个正常的匹配
  2. \1:引用第一个分组的结果
  3. \&:前面所有分组的结果
# 123 转变为 numnumnum
# s/.../num/g 内匹配目标,即1,2,3,匹配三次
# s/[[:digit:]]/.../g 是替换的内容,num
# 注意要将预定义集合放在 [] 内
# 输出 numnumnum
echo 123 | sed 's/[[:digit:]]/num/g'

# 贪婪匹配,输出 num
echo 123 | sed 's/[[:digit:]]*/num/g'

# 指定匹配次数,输出 numnum
echo 123 | sed 's/[[:digit:]]\{1,2\}/num/g'

# 匹配 1,2,3 三个分组
# \2 引用第二个分组的结果
# 输出 2
echo 123 | sed 's/\(1\)\(2\)\(3\)/\2/g'

扩展正则表达式

  1. ?+{x}() 不用转义,即由 ? 变为 ?
  2. |:或

正向预查(lookahead)和回顾查找(lookbehind)

这是一个扩展功能,很多工具未必会支持。

  1. (str):匹配str,后面可用 \1 索引获得结果
  2. (?:str):匹配str,但不支持索引
  3. msg(?=str):正向预查,msg 之后是 str,才能匹配 msg,且接下来从 str 开始下次正式查找。
  4. msg(?!str):正向预查否定式,msg 之后不是 str,才能匹配 msg
  5. (?<=str)msg:回顾查找,msg 之前是 str,才能匹配 msg
  6. (?<!str)msg:回顾查找否定式,msg 之前不是 str,才能匹配 msg
# 正向预查,2 之后为 3,即匹配第二个 2 
echo 1223 | grep -P '2(?=3)'

# 回顾查找,2 之前为 1,即匹配第一个 2
echo 1223 | grep -P '(?<=1)2'

参考

  1. Linux文本三剑客超详细教程---grep、sed、awk:https://www.cnblogs.com/along21/p/10366886.html
  2. 贪婪与懒惰:https://deerchao.cn/tutorials/regex/regex.htm#greedyandlazy
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/coder_lw/wiki.git
git@gitee.com:coder_lw/wiki.git
coder_lw
wiki
wiki
master

搜索帮助

Bbcd6f05 5694891 0cc6727d 5694891