知识库

wiki.linsakura.com

用户工具

站点工具


wiki:dev:regexp:use

正则表达式

作用

  • 判断给定的字符串是否匹配
  • 替换特定文本
  • 从字符串提取子字符串

日常中的使用

在linux中查找文件

查找/usr/share/下,所有mono字体

find . | egrep [mM]ono.*[\.]\(otf\|ttf\)$
find . | egrep "[mM]ono.*\.(otf|ttf)$"

VSCode 搜索代码

查找包含path=的字符串
rx: "[^"]*path[ ]*=[^"]*"

Notepad++ 查找文本

查找日期
rx: \d{4}-\d{2}-\d{2}

编程语言中的使用

  • 看字符串是否匹配
  • 提取里面特定字符串
  • 替换里面的文字

语法

普通字符

字母、数字等,如ABC、abc、123等

非打印字符

\r \n \t

特殊字符

就是需要用\转义的字符
$ ( ) * + . [ ? \ ^ { |
注:在代码里,匹配\则需要写成\\\\,当然有的语言支持直接写原表达式

集合或范围

[ABC]: 表示ABC中的任意一个字母
[^ABC]: 表示除了ABC的任意字符
[a-z]: 表示a到z的所有小写字母
. : 除\r \n之外的任意字符
\s: 所有空白字符,包括换行
\S: 所有非空白字符
\w: 字母、数字、下划线,等价于[A-Za-z0-9_]

限定符

用于指定给定的组合出现多少次

  • * : 匹配0次或多次
  • + : 匹配1次或多次
  • ? : 匹配0次或1次
  • {n} : 匹配n次
  • {n,} : 匹配n次及其以上
  • {n,m} : 匹配n到m次

都可用{n,m}方式表达,如:
* = {0,}+ = {1,}? = {0,1}

定位符

  • ^: 匹配字符串开始位置
  • $: 匹配字符串结尾位置
  • \b: 匹配单词边界
  • \B: 匹配非单词边界

贪婪匹配

*+后加?,即非贪婪匹配
str: <a>这首<strong>歌曲</strong>真好听</a>
rx: <.+>
output: <a>这首<strong>歌曲</strong>真好听</a>
rx: <.+?>
output: <a> <strong> </strong> </a>

分组与选择

''|''的使用

str: lan qian
rx: (l|qi)an
表示匹配已lqi开头的,并以an结尾的字符串

捕获分组

()括起来表示捕获分组,并会缓存匹配
str: <1,21,321>
匹配整个字符串: <\d+,\d+,\d+>
匹配并获取到3个数字: <(\d+),(\d+),(\d+)>

非捕获元

使用()会缓存分组,如果不想缓存,即可用到非捕获元

?:

(?:exp)
str: lan qian
rx: (?:l|qi)an
(加上?:后,即不缓存此分组

?=

exp1(?=exp2)
匹配后面是exp2的exp1
str: name:hakurei, age:18, weight:45, gender:famale
rx: \w+(?=:\d+)
output: age weight

?<=

(?⇐exp1)exp2
匹配前面是exp1的exp2
str: name:hakurei, age:18, weight:45, gender:famale
rx: (?<=age:)\d+
output: 18

?!

exp1(?!exp2)
匹配后面不是exp2的exp1
str: name:hakurei, age:18, weight:45, gender:famale
rx: [a-zA-Z]+:(?!\d+)
output: name: gender:

?<!

exp1(?<!exp2)
匹配前面不是exp1的exp2
str: name:hakurei, age:18, weight:45, gender:famale
rx: (?<!age:)[a-zA-Z0-9]+
output: :hakurei :45 :famale

参考图


wiki/dev/regexp/use.txt · 最后更改: 2023/01/09 16:47 由 博丽幻月