使用正则表达式

语法

基本
. 任意单个字符
| 逻辑或
[] 字符集合
[^] 字符集合求非
- 区间定义
\ 字符转义
() 定义一个子表达式
数量
* 0次或多次,懒惰模式 *?
+ 1次或多次,懒惰模式 +?
? 0次或1次
{n} n次
{m,n} m次和n次之间
{n,} n次以上,懒惰模式 {n,}?
位置
^ 开头(\A)
$ 结尾(\Z)
< 单词开头
> 单词结束
\b 单词边界
特殊
\t 制表 Tab
\v 垂直制表符 Vertical tab
\n 换行 Line feed
\r 回车 Carriage Return
\f 换页 Form feed
\s 空白 space, \t, \n, \f, \r
\d 数字 [0-9]
\w 字母数字或下划线 [a-zA-Z_0-9]

查找 (lookaround)

https://www.regular-expressions.info/lookaround.html

查找
?: non capturing group
?= positive look ahead
?! negative look ahead
?<= positive look behind
?<! negative look behind
  • 括号中的数字 (?<=\()[0-9]+(?=\))
  • (?!\()[0-9]+(?<!\))

替换匹配文本

  • Java, JetBrains, vscode $0
  • PHP, EmEditor \0
  • JavaScript $&

Reinserting Matched Text in The Replacement Text

常用匹配

中国18位身份证号

1
\d{17}(\d|X|x)

中国手机号码

1
1[34578][012356789]\d{8}|134[012345678]\d{7}

邮箱

1
^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$

URL地址

1
2
(https?:\/\/)?([\w\-])+\.{1}([a-zA-Z]{2,63})([\/\w-]*)*\/?\??([^#\n\r]*)?#?([^\n\r]*)
/((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/

IP地址

1
/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/

CJK字符

1
[\u4e00-\u9fa5]

提取示例

提取括号中的数字

1
(?<=\()[0-9]+(?=\)) -> \0

${param.xxx} 批量替换为 ${fn:escapeXml(param.xxx)}

1
2
(?<=\$\{)param\..*?(?=\})
fn:escapeXml\($0\)

tsv内容转SQL insert

1
2
3
4
5
110000	a	1	北京市

(?<=^)[^\t]+(?=\t) -> ('\0',
(?<=\t)[^\t]+(?=\t) -> '\0',
(?<=\t)[^\t]+(?=$) -> '\0'),

vim中的使用

去除空行

1
%s/^\s*\n/

去除行尾空格

1
%s/\s\+\n/\r

去除#注释行

1
%s/^\s*#.*\n/

换行的文本转字符串拼接

1
%s/\s*\n/" \+\r"

‘逗号分隔行’ 与 ‘单行逗号分隔’ 转换

1
2
%s/,\s*\n/,[ ]
%s/, */,\r/g

JavaScript中的使用

有两种方法可以创建正则表达式:通过字面量/pattern/flags,或new RegExp(pattern [, flags])。flags值可以是i(忽略大小写)g(全局匹配)m(多行匹配)

字面量方式判断是否全部数字组成:/^\d+$/.test('12a')

表达式方式

1
2
var pat = new RegExp(this.currentL1 + "[\\d]{2}00");
pat.test(key)

Perl中的使用

下划线转驼峰

1
2
my $n = 'mastering_regular_experssions';
$n =~ s/_([a-z])/\U\1\E/g;

使用

提取字幕内容

1
2
3
替换时间 ^\d\d:.*\n
替换序号 ^\d+\n
替换断行 (?<=[^\s])\r\n(?=[^\s])

替换标注

1
\[\d+\]