Skip to content

regex

vim

/^hello\>      " 匹配行首的单词 hello
:%s/foo/bar/g  " 全局替换 foo 为 bar
:%s/\(\d\+\)/[\1]/g  " 将所有数字用 [] 包裹(捕获组)

捕获组::%s/\(\d\+\)/[\1]/g 将所有数字用 [] 包裹(捕获组)

删除空行

:g/^$/d # delete empty line
:g/^\s*$/d # delete line with only empty char
:%s/^\s*$//g # clean empty char

shell

文件名匹配(通配符)、=~ 操作符用于字符串匹配。Shell 本身使用 glob 模式(非标准正则),但 [[ ]]=~ 支持 扩展正则表达式(ERE)

if [[ "hello" =~ ^he ]]; then
    echo "匹配"
fi
ls *.txt       # 匹配所有.txt文件
ls file?.log   # 匹配 file1.log, file2.log 等

正则表达式(Regex)在不同工具和编程语言中的语法和功能略有差异。以下是 Shell、Vim、Lua、Python、grep、sed、ripgrep 中正则表达式的用法对比和示例:

Lua

  • 用途 :字符串匹配( string.match, string.gsub )。
  • 特点 :Lua 的 regex 是 轻量级 的,不支持常见的 \d\w ,需用字符类如 %d
-- 提取数字
local str = "abc123"
local num = string.match(str, "%d+")  -- 返回 "123"
-- 替换
local new_str = string.gsub("hello world", "world", "Lua")

Python(re 模块)

- 特点 :支持 标准正则表达式(PCRE) ,功能全面(如非贪婪匹配、命名组等)。

import re
re.findall(r'\d+', 'abc123')      # 返回 ['123']
re.sub(r'foo', 'bar', 'foobar')   # 替换为 'barbar'
# 命名捕获组
match = re.search(r'(?P<year>\d{4})', '2023')
print(match.group('year'))  # 输出 '2023'

grep

  • 用途 :文件内容搜索。
  • 模式
  • grep 默认使用 基本正则表达式(BRE)
  • grep -Eegrep 使用 扩展正则表达式(ERE)
  • grep -P 支持 PCRE (部分系统)。
  • 示例
grep '^hello' file.txt       # 匹配行首的 hello(BRE)
grep -E '[0-9]{3}' file.txt # 匹配3位数字(ERE)
grep -P '\d+' file.txt      # 匹配数字(PCRE)

sed

  • 用途 :流编辑器,支持查找替换。
  • 模式
  • 默认使用 BRE
  • sed -E 启用 ERE
  • 示例
sed 's/foo/bar/g' file.txt           # 替换 foo 为 bar(BRE)
sed -E 's/[0-9]+/NUM/g' file.txt     # 替换数字为 NUM(ERE)
sed 's/\(.*\)/\U\1/' file.txt        # 转换为大写(捕获组)

ripgrep(rg)

  • 用途 :高性能文件搜索。
  • 特点 :默认使用 PCRE ,支持 Unicode 和智能大小写。
  • 示例
rg '\d{3}'       # 搜索3位数字
rg -i 'hello'    # 忽略大小写搜索
rg -U 'foo.*bar' # 多行匹配(跨行)

常见正则符号对比

功能 PCRE/Python BRE (grep/sed) ERE (grep -E) Vim Lua
数字 \d [0-9] [0-9] \d %d
单词字符 \w [[:alnum:]] \w \w %a
量词 +``*``? \+ \* \? + *``? \+ \* + *
捕获组 (...) \(...\) (...) \(...\) (...)