Skip to content

Latest commit

 

History

History
161 lines (112 loc) · 6.65 KB

21.gregex简介.md

File metadata and controls

161 lines (112 loc) · 6.65 KB

GoFrame实战之正则表达式介绍

正则表达式

正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符")。

正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

正则表达式是烦琐的,但它是强大的,学会之后的应用会让你除了提高效率外,会给你带来绝对的成就感。

发展历史

正则表达式的"祖先"可以一直上溯至对人类神经系统如何工作的早期研究。Warren McCulloch 和 Walter Pitts 这两位神经生理学家研究出一种数学方式来描述这些神经网络。

1956 年, 一位叫 Stephen Kleene 的数学家在 McCulloch 和 Pitts 早期工作的基础上,发表了一篇标题为"神经网事件的表示法"的论文,引入了正则表达式的概念。正则表达式就是用来描述他称为"正则集的代数"的表达式,因此采用"正则表达式"这个术语。

随后,发现可以将这一工作应用于使用 Ken Thompson 的计算搜索算法的一些早期研究,Ken Thompson 是 Unix 的主要发明人。正则表达式的第一个实用应用程序就是 Unix 中的 qed 编辑器。

如他们所说,剩下的就是众所周知的历史了。从那时起直至现在正则表达式都是基于文本的编辑器和搜索工具中的一个重要部分。

正则示例

示例一-文本处理

我们要从日志中获取到格式化的【名称,身份证,手机号】,文件test.txt:

[2020-08-19 17:33:19.467][INFO][com.XXX1.Utils:83][Utils is call {name=王翦,idcard=110111111111,phone=15311111111}]
[2020-08-19 17:34:19.467][INFO][com.XXX2.Utils:83][Utils is call {name=李牧,idcard=110111111112,phone=15311111112}]
[2020-08-19 17:35:19.467][INFO][com.XXX3.Utils:83][Utils is call {name=廉颇,idcard=110111111113,phone=15311111113}]
[2020-08-19 17:36:19.467][INFO][com.XXX4.Utils:83][Utils is call {name=白起,idcard=110111111114,phone=15311111114}]
  1. \[2020.*Utils is call \{name=替换为空,然后将idcard=phone=}]替换为空
  2. \[2020.*Utils is call \{name=(.*),idcard=(.*),phone=(.*)\}\]替换为\1,\2,\3

输出结果:

王翦,110111111111,15311111111
李牧,110111111112,15311111112
廉颇,110111111113,15311111113
白起,110111111114,15311111114

示例二-文本处理

[2020-08-19 17:33:19.467][INFO][com.XXX1.Utils:83][Utils is call wangjian@sina.com 123]
[2020-08-19 17:34:19.467][INFO][com.XXX1.Utils:83][Utils is call limu@qq.com 1112]
[2020-08-19 17:35:19.467][INFO][com.XXX1.Utils:83][Utils is call lipo@hotmail.com 1345]
[2020-08-19 17:36:19.467][INFO][com.XXX1.Utils:83][Utils is call baiqi@163.com 123123]
[2020-08-19 17:36:19.467][INFO][com.XXX1.Utils:83][Utils is call qishihuang@163.com.cn 123123]
  1. \[2020.*Utils is call (.*@.*\..*) .*\]替换为\1;

输出结果:

wangjian@sina.com
limu@qq.com
lipo@hotmail.com
baiqi@163.com
qishihuang@163.com.cn

示例三-GREP

grep 命令用于查找文件里符合条件的字符串。

grep基本命令:

# grep '[1234567890]{5,10}' -E test.txt --color
[2020-08-19 17:33:19.467][INFO][com.XXX1.Utils:83][Utils is call {name=王翦,idcard=110111111111,phone=15311111111}]
[2020-08-19 17:34:19.467][INFO][com.XXX2.Utils:83][Utils is call {name=李牧,idcard=110111111112,phone=15311111112}]
[2020-08-19 17:35:19.467][INFO][com.XXX3.Utils:83][Utils is call {name=廉颇,idcard=110111111113,phone=15311111113}]
[2020-08-19 17:36:19.467][INFO][com.XXX4.Utils:83][Utils is call {name=白起,idcard=110111111114,phone=15311111114}]

示例四-AWK

AWK 是一种处理文本文件的语言,是一个强大的文本分析工具。

awk 语法: [-F field-separator] '{pattern + action}' {filenames}

awk基本命令:

# awk '/[0-9]{11}/'  test.txt 
[2020-08-19 17:33:19.467][INFO][com.XXX1.Utils:83][Utils is call {name=王翦,idcard=110111111111,phone=15311111111}]
[2020-08-19 17:34:19.467][INFO][com.XXX2.Utils:83][Utils is call {name=李牧,idcard=110111111112,phone=15311111112}]
[2020-08-19 17:35:19.467][INFO][com.XXX3.Utils:83][Utils is call {name=廉颇,idcard=110111111113,phone=15311111113}]
[2020-08-19 17:36:19.467][INFO][com.XXX4.Utils:83][Utils is call {name=白起,idcard=110111111114,phone=15311111114}]
# awk '/[1234567890]{10}4/'  test.txt 
[2020-08-19 17:36:19.467][INFO][com.XXX4.Utils:83][Utils is call {name=白起,idcard=110111111114,phone=15311111114}]

awk分割功能:

[root@node177 ~]# awk -F  '[,{}]'  '/[0-9]{11}/{print $2"\t"$3"\t"$4}'  test.txt 
name=王翦	idcard=110111111111	phone=15311111111
name=李牧	idcard=110111111112	phone=15311111112
name=廉颇	idcard=110111111113	phone=15311111113
name=白起	idcard=110111111114	phone=15311111114

示例四-SED

sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。

sed命令:sed [options] 'command' file(s)

sed基本命令

# sed '/[1234567890]{11}/p'  test.txt 
[2020-08-19 17:33:19.467][INFO][com.XXX1.Utils:83][Utils is call {name=王翦,idcard=110111111111,phone=15311111111}]
[2020-08-19 17:34:19.467][INFO][com.XXX2.Utils:83][Utils is call {name=李牧,idcard=110111111112,phone=15311111112}]
[2020-08-19 17:35:19.467][INFO][com.XXX3.Utils:83][Utils is call {name=廉颇,idcard=110111111113,phone=15311111113}]
[2020-08-19 17:36:19.467][INFO][com.XXX4.Utils:83][Utils is call {name=白起,idcard=110111111114,phone=15311111114}]

sed替换,sed 's/要被取代的字串/新的字串/g':

[root@node177 ~]# sed 's/[0-9]\{11\}/c/g'  test2.txt 
[2020-08-19 17:33:19.467][INFO][com.XXX1.Utils:83][Utils is call {name=王翦,idcard=c1,phone=c}]
[2020-08-19 17:34:19.467][INFO][com.XXX2.Utils:83][Utils is call {name=李牧,idcard=c2,phone=c}]
[2020-08-19 17:35:19.467][INFO][com.XXX3.Utils:83][Utils is call {name=廉颇,idcard=c3,phone=c}]
[2020-08-19 17:36:19.467][INFO][com.XXX4.Utils:83][Utils is call {name=白起,idcard=c4,phone=c}]

示例五-GoFrame

gregex提供了对正则表达式的支持,底层是对标准库regexp的封装,极大地简化了正则的使用,并采用了解析缓存设计,提高了执行效率。

package main

import (
    "fmt"
    "github.com/gogf/gf/v2/text/gregex"
)

func main() {
    match, _ := gregex.MatchString(`(\w+).+\-\-\s*(.+)`, `GF is best! -- John`)
    fmt.Printf(`%s says "%s" is the one he loves!`, match[2], match[1])
}

执行后,输出结果为:

John says "GF" is the one he loves!