# RegExp
**Repository Path**: LinWanCen/RegExp
## Basic Information
- **Project Name**: RegExp
- **Description**: 正则表达式高级教程与优化指南
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-06-03
- **Last Updated**: 2022-05-24
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 正则表达式高级
——《精通正则表达式》
+Java/Go/Python官方文档
+多年经验
+实验结果
知识整理
[正则表达式优化](RegExpOpti.md)
[TOC]
第3章 正则表达式的特性和流派概览
## 常用的元字符和特性 102
基本语法
https://www.runoob.com/regexp/regexp-metachar.html
### 量词
- `{n}` `{n,}` `{n,m}`
- `*`同`{0,}`
- `+`同`{1,}`
- `?`同`{0,1}`
- 量词默认匹配优先(贪婪,越多越好)
- **后面加`?`则忽略优先(非贪婪,越少越好)**
- 后面加`+`则占有优先(类似固化分组, golang不支持),
匹配了就不会还回去,例如
用`.*+c`匹配`abc`,
`.*`会匹配优先地匹配到`abc`三个字符,
如果没有`+`时发现匹配失败就会回溯到`.*`匹配两个的情况,这时匹配成功;
而有`+`就占有不还回去了,匹配失败。
### 分组与捕获
```Java
"abc".replaceAll("a(.*)c", "s$1"); // sb
"b2b".replaceAll("(.*)2\\1", "s$1"); // sb
"b2b".replaceAll("(?.*)2\\k", "s${a}"); // sb
Pattern p = Pattern.compile("a(?.*)c");
Matcher m = p.matcher("abc");
while (m.find()) {
System.out.println(m.group(1)); // b
System.out.println(m.group("a")); // b
}
```
反向引用组编号n为0代表全部,同`m.group()`
- **分组并捕获`(...)`**
- 正则反向引用(Java Python)`\n`(golang貌似未提供)
- **字符反向引用(Java golang)`$n`**
- 字符反向引用(Python)`\n` `\g`
-
- 命名捕获(Java)`(?...)`
- 正则反向引用(Java)`\k`
- 字符反向引用(Java golang)`${name}`
- 字符反向引用(golang)`$name`
-
- 命名捕获(Python golang)`(?P...)`
- 正则反向引用(Python)`(?P=name)`
- 字符反向引用(Python)`\g`
-
- **多选结构`...|...`**
- **仅分组不捕获`(?:...)`**
- 固化分组(golang不支持)`(?>...)`
-
- 注释(宽松排列时 golang不支持)`# ...`
Java不支持:
- 条件(Python)`(?(n/name)...|...)`
- 代码条件`(?... ...|...)`
- 嵌入式注释`(?#...)`
- 嵌入式代码`(?{...})`
- 动态表达式`(??{...})`
### 边界
锚点:
- **行始`^`**
- 文始`\A` `\G`
- **行末`$`**
- 文末`\Z` `\z`
- 单词边界`\b`
- 非单词边界`\B`
环视结构(零长度断言,golang不支持):
- 顺序环视
- **左边是A:`(?<=A)`**
- **左边不是A:`(??@[\\\]^_`{|}~]`
`[[:lower:]]`小写`[a-z]`
`[[:print:]]`可打印`[ -~] == [ [:graph:]]`
`[[:punct:]]`标点`[!-/:-@[-`{-~]`
`[[:space:]]`空字符`[\t\n\v\f\r ]`
`[[:upper:]]`大写`[A-Z]`
`[[:word:]]`字符`[0-9A-Za-z_]`
`[[:xdigit:]]`十六进制`[0-9A-Fa-f]`
Unicode组:
- `\p{}`Unicode 区块/属性/分类,如
java汉字
```Java
"Hi,你好!".replaceAll("[^\\p{javaIdeographic}]", ""); // 你好
Character.isIdeographic(int codePoint) // CJKV(中文,日文,韩文和越南文)表意文字
```
https://docs.oracle.com/en/Java/Javase/12/docs/api/Java.base/Java/util/regex/Pattern.html
golang汉字
```golang
package main_test
import (
"fmt"
"regexp"
)
func ExampleFindAllString() {
r := regexp.MustCompile(`[\p{Han}]+`) // 汉字
split := r.FindAllString("你好,中国!", -1)
for _, s := range split {
println(s) // 不计入output
fmt.Println(s)
}
// Output:
// 你好
// 中国
}
```
https://studygolang.com/static/pkgdoc/pkg/regexp.htm
https://godoc.org/regexp/syntax
https://godoc.org/regexp
python汉字
```Python
# coding=utf-8
import re
if __name__ == "__main__":
print(re.findall(r'[\u4e00-\u9fa5]+', '你好,中国!'))
```
https://docs.Python.org/zh-cn/3/library/re.html#contents-of-module-re
### 字符
- `\a`警报同`\x09` `\cI`
- `\b`退格同`\x09` `\cI`
- `\e`退出同`\x09` `\cI`
-
- `\t`制表同`\x09` `\cI`
- `\n`换行同`\x0a` `\cJ`
- `\v`直表同`\x0b` `\cK`
- `\f`分页同`\x0c` `\cL`
- `\r`回车同`\x0d` `\cM`
- `\*`
-
- `\07` `\77` `0377`八进制(带0是Java特殊)
- `\xFF` `\uFFFF` 十六进制
- `\x{10FFFF}` 十六进制(golang)
- `\u00A9`Unicode 版权符号
-
- `\Q...\E`不使用元字符和转义序列