# regExp_learn
**Repository Path**: johndriver/regExp_learn
## Basic Information
- **Project Name**: regExp_learn
- **Description**: No description available
- **Primary Language**: Unknown
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2022-05-05
- **Last Updated**: 2022-05-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 正则表达式
## 转义符号
* java使用`\\`代表其他语言的`\`
* 需要转义的表示
```text
()[]{} : \\( \\) \\[ \\] \\{ \\}
. * + ? : \\. \\* \\+ \\?
^ $ : \\^ \\$
\ : \\\\
```
* [] 内有的不需要转义,可以直接使用 需要的有:`[`和`^`和`\`
```text
()[]{} : [(] [)] [{] [}] [\\[] []]
. * + ? : [.] [*] [+] [?]
^ $ : [\^] [$]
\ : [\\\\]
```
## 字符匹配符
|符号|含义|示例|匹配|取非|
|----|----|----|----|---|
|.|非\n的一个字符|a..b|aaab,a#*b|\\n|
|\\d|digit:一个数字:[0-9]|\\d{3}(\\d)?|123,9876|\\D|
|\\w|word:字母数字下划线:[0-9A-Za-z_]|\\d{3}\\w{4}:3个数字+4个word|123456dw,1234wood|\\W|
|\\s|space:空白符:[\\t\\n\\r\\v\\f]| | |\\S|
* [0-9] [^0-9]
* [abc123] [^abc123]
## 不区分大小写
1. (?!):
* (?i)AbC 匹配(abc不区分大小写):ABC abc aBc
* a(?i)bc 匹配(bc不区分大小写):aBC abc
* a((?i)b)c 匹配(b不区分大小写):abc aBc
2. Pattern.CASE_INSENSITIVE
* Pattern.compile("abcd",Pattern.CASE_INSENSITIVE);
* Pattern.compile("abcd",2);
## 限定符
* 一个字符直接用,多个字符任选一个重复用`[]`,多个字符一起用`()`括起来
* 非贪婪模式,后面再加个`?`,表示匹配到最少数量就可以
|符号|含义|示例|说明|匹配|
|----|----|----|----|----|
|*|{0,}|a* [abc]* (abc)*|
|+|{1,}|a+ [abc]+ (abc)+|
|?|{0,1}|a? [abc]? (abc)?|
|{n}| |a{4} [abc]{4} (abc){4}|
|{m,n}| |a{2,3} [abc]{2,3} (abc){2,3}|
|{m,}| |a{2,} [abc]{2,} (abc){2,}|
## 选择匹配符
* `|`
```text
\\d{3}|[a-zA-Z]{3}
```
## 定位符
|符号|含义|示例|说明|匹配|
|----|----|----|----|----|
|^|指定起始字符|^[0-9]+其他|以1-n个数字开头,|
|$|指定结束字符|其他[a-zA-z]{3,5}$|以3-5个字母结束|
|\\b|字符边界|\\bspac|spac的左边为空格或字符起始或标点符号|
|\\B|非字符边界|space\\B|
## 分组组合和反向引用
1. 捕获分组
|构造|说明|示例|
|----|----|----|
|(表达式)|非命名分组:group(0):匹配全部,分组按照左括号的顺序分为1,2,3---| abc(bc)(c(d)):
group(0):abcbccd
group(1):bc
group(2):cd
group(3):d|
|?\(表达式)|命名分组:除了使用group(int index),还可以适应group(string name)获取结果|abc(?\bc)(?\c(?\d))
2. 非捕获分组:使用()但是取消分组,不能使用group()获取
* (?:表达式)
* 处理的问题:industr(y|ies),使用或,但是不要()分组,后缀(y|ies)也匹配
* 使用:industr(?:y|ies)
* (?=表达式)
* 处理的问题:windows(8|10|11)通过后缀(8或10或11)获取后缀之前的字符(windows),但不要后缀(8或10或11)
* 使用:windows(?=8|10|11)
* (?=表达式)
* 处理的问题:通过后缀非(8或10或11)的如window95获取后缀之前的字符(windows),但不要后缀95
* 使用:windows(?!8|10|11)
3. 反向引用
* \\n
* 在正则表达式中使用,表示重复第n个分组的内容
* 例子:(\\d)\\1{2} 表示第一个分组重复2次,达到3个相同的数字:如222 333 4444
* $n
* 在正则表示式外引用分组neirong
* 例子
```text
String s = Pattern.compile("(\\w{2})\\1{2}(cd)")
.matcher("abababcdefgh")
.replaceAll("$2");
```
1. matcher结果匹配:abababcd
2. $2:表示第二个括号匹配的内容:cd (补充:$1为:ab)
3. 式子表示:将`abababcdefgh`中的`abababcd`全部替换为`ab`,相当于
```text
"abababcdefgh".replaceAll("(\\w{2})\\1{2}(cd)", "$2");
```
## 特殊字符