regexp包
regexp 包
正则表达式语法
是一种字符串匹配模式或者规则,用来检索、替换那些符合特定规则的文本。
元字符
| 元字符 |
匹配内容 |
| . |
匹配除换行符以外的任意字符 |
| \w |
匹配所有普通字符(数字、字母或下划线) |
| \s |
匹配任意的空白符 |
| \d |
匹配数字 |
| \n |
匹配一个换行符 |
| \t |
匹配一个制表符 |
| \b |
匹配一个单词的结尾 |
| ^ |
匹配字符串的开始位置 |
| $ |
匹配字符串的结尾位置 |
| \W |
匹配非字母或数字或下划线 |
| \D |
匹配非数字 |
| \S |
匹配非空白符 |
| a|b |
匹配字符 a 或字符 b |
| () |
正则表达式分组所用符号,匹配括号内的表达式,表示一个组。 |
| […] |
匹配字符组中的字符 |
| [^…] |
匹配除了字符组中字符的所有字符 |
量词
| 量词 |
用法说明 |
| * |
重复零次或者更多次 |
| + |
重复一次或者更多次 |
| ? |
重复0次或者一次 |
| {n} |
重复n次 |
| {n,} |
重复n次或者更多次 |
| {n,m} |
重复n到m次 |
字符组
| 正则 |
待匹配字符 |
匹配结果 |
说明 |
| [0123456789] |
8 |
True |
在一个字符组里枚举所有字符,字符组里的任意一个字符 和”待匹配字符”相同都视为可以匹配。 |
| [0123456789] |
a |
False |
由于字符组中没有 “a” 字符,所以不能匹配。 |
| [0-9] |
7 |
True |
也可以用-表示范围,[0-9] 就和 [0123456789] 是一个意思。 |
| [a-z] |
s |
True |
同样的如果要匹配所有的小写字母,直接用 [a-z] 就可以表示。 |
| [A-Z] |
B |
True |
[A-Z] 就表示所有的大写字母。 |
| [0-9a-fA-F] |
e |
True |
可以匹配数字,大小写形式的 a~f,用来验证十六进制字符。 |
贪婪匹配和非贪婪匹配
正则表达式默认为贪婪匹配,也就是尽可能多的向后匹配字符,比如 {n,m} 表示匹配前面的内容出现 n 到 m 次(n 小于 m),在贪婪模式下,首先以匹配 m 次为目标,而在非贪婪模式是尽可能少的向后匹配内容,也就是说匹配 n 次即可。
| 元字符(贪婪模式) |
非贪婪模式 |
| * |
*? |
| + |
+? |
| ? |
?? |
| {n,m} |
{n,m}? |
实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
| package main import ( "fmt" "regexp" "strconv" ) func main() { searchIn := "John: 2578.34 William: 4567.23 Steve: 5632.18" pat := "[0-9]+.[0-9]+"
f := func(s string) string{ v, _ := strconv.ParseFloat(s, 32) return strconv.FormatFloat(v * 2, 'f', 2, 32) }
if ok, _ := regexp.Match(pat, []byte(searchIn)); ok { fmt.Println("Match Found!") }
re, _ := regexp.Compile(pat) str := re.ReplaceAllString(searchIn, "##.#") fmt.Println(str) str2 := re.ReplaceAllStringFunc(searchIn, f) fmt.Println(str2) }
|