java正则表达式并且条件_Java⾥正则表达式(包括⼀些⾼级
⽤法)
有些内容只有在 Java ⾥⾯才能使⽤。 ------原⽂作者:逗号 (他不⾼兴发博客)
## 字符种类
部分使⽤频率⼏乎为 0 的这⾥不会提及(⽐如 \x 之流)
### 普通
| | 含义 | 助记 |
| ---- | ------------------------------------- | ----- |
| \s | ⾮空⽩ | space |
| \s | 空⽩ | |
| \d | 数字 | digit |
| \D | ⾮数字 | |
| [] | ⾃定义字符种类可使⽤ ^ \| && 随意组合 | |
### 特别
| | 含义 | 助记 |
| ------- | ------------------------------------------------------------ | ---------- |
| \h | 横向字符 | horizontal |
| \h | ⾮横向字符 | |
| \v | 纵向字符(⽐如说换⾏符) | vertical |
| \V | ⾮纵向字符 | |
| \w | 单词字符(包括 - _) | word |
| \W | ⾮单词字符 | |
| \p{XXX} | POSIX,这个并不常⽤,在有些时候会⽅便,Character 有很多 is开头的⽅法,将⽅法名中的`is`替换为`Java`可直接使⽤进⾏字符匹配:\p{javaLowerCase} | posix |
| \Q | 字符转义开始符 | |
| \E | 字符转义结束符,这两个符号之间的内容全部按照字⾯量处理,⾥⾯是所有字符都不会有什么含义,⽐如 . 就是 .,\s 必须匹配\s,⽽不是匹配空⽩。 | |
## 量词
| | 含义 | 助记 |
| ----- | ------------- | ---- |
| ? | 0个或者1个 | |
| * | 0个或多个 | |
| + | 1个或多个 | |
| {m} | m个 | |
| {m,n} | 介于m~n个之间 | |
`?`修饰在量词之后,表尽可能少的匹配!
## 边界
### 普通
| | 含义 | 助记 |
| ---- | ------------ | ---- |
| ^ | 字符开始位置 | |
| $ | 字符结束位置 | |
### 特别
| | 含义 | 助记 |
| ---- | ------------------------------ | ---- |
| \b | 单词边界,单词的最前⾯和最后⾯ | |
| \B | ⾮字符串边界 | |
下⾯的内容普通⼈基本上就已经不管了!
## 分组捕获
正则表达式中,每出现⼀对括号就是新建了个新的组。⽐如:`(\\w+)|(\\d+)`
正则表达式的组可以⽤使⽤索引进⾏引⽤,形式为:`$index`
`$0` 默认指向原来的全部字符
然后索引递增规律如下:
`((a)|(bc))`
`$1` 指向 `((a)|(bc))` 匹配的内容
`$2` 指向 `(a)` 匹配的内容
`$3` 指向 `(bc)` 匹配的内容
然⽽当正则复杂之后,改动将会对索引有较⼤影响,也不⽅便计算索引,此时,你可以为组制定名称:
⽐如匹配字符串:`a=123,b=456`中间的键值,使⽤索引,需要写成:`(\\w+)=(\\S+)`,然后使⽤`$1`指向 key,使⽤ `$2` 指向value。
我们可以将正则改为:`(?\\w+)=(?\\S+)`,上述表达式使⽤ `?` 的形式在正则中为组定义名称。
## 引⽤分组
在 Java 中,你可以在两种地⽅使⽤引⽤:
* 正则表达式中
匹配 `xxx-xxx` 字符 `-` 两边的内容相同,使⽤索引引⽤前⾯的组(`\\index`):
```regexp
(\\w+)-\\1
```
使⽤名字引⽤前⾯的组:
```regexp
(?\\w+)-\\k
```
* 在 Java 的字符串替换中
Markdown 中的字符串转为斜线的html:
```java
"*name*".replaceAll("\\*(?\\w+)\\*", "$1")
"*name*".replaceAll("\\*(?\\w+)\\*", "${content}")
```
## 模式
你可以在构造 `Pattern`时设定模式:
```Java
Patternpile("abc", Pattern.CASE_INSENSITIVE)
```
模式可以⾃⾏到 `Pattern`下查看,这⾥只说使⽤⽅式,在组开头使⽤ `?flags:`的⽅式声明模式,⽐如:
匹配单词,不区分⼤⼩写
```regex
(?i:\\w+)
```
记住`i`(忽略⼤⼩写)、`s`(. 匹配全部字符)即可,其他基本不⽤。
## 前瞻后顾
前瞻后顾,是正则表达式中的⾼级技巧,主要有5种:
> 注意:虽然这货也有括号,但是这货只算个条件,并不会捕获任何内容,也不会影响索引
### 前瞻
前瞻中不带`
* `exp1(?=exp2)`
寻后⾯是 exp2 的 exp1
* `exp1(?!exp2)`
### 后顾
* `(?<=exp1)exp2`
匹配 exp1 后⾯的 exp2,前⾯没有exp1的内容将被忽略,⽐如,替换`abcba`替换`c`后⾯的`b`为 `xxx`,需要写为:```java
"abcba".replaceAll("(?<=c)b", "xxx")
```
`a`后⾯的`b`则不受影响。
> 注意:正则表达式`(?<=c)b`不会匹配字符串`cb`,意思就是:
>
> ```java
> assertFalse("cb".matches("(?<=c)b"));
> assertFalse("b".matches("(?<=c)b"));
> assertTrue("cb".matches("c(?<=c)b"));
> ```
* `(?
后顾中带有 `
## ⽜⼑⼩试
以下所有内容只能使⽤`String#repalceAll`或者`String#matches`完成。
### ⼿机号遮罩
将`11`位⼿机号除前4位之外,其他的使⽤`*`替换。
### 格式化数字
regex匹配例如:`1234567890` 使⽤正则替换之后,变为 `1,234,567,890`。
### Trim 字符串
使⽤正则去除字符串开始和结束的空⽩字符。
### 去除数字结尾的`0`
`1234.4500`应该处理为`1234.45`,`1234.00`应该处理为`1234`。
### 处理⽂档
将字符串的`* 测试 * ** 测试 **`的使⽤单个`*`包围的内容两边分别加上`
`、`
`,不能影响两个`**`包围的内容。
### 测试某个字符串是不是合法的Java标识符
### 测试`IPv4`
已知`IPv4`中每⼀段的数字需要介于0~255,测试某个字符串是否是合法的`IPv4`表达式。### 去除`//`注释
已知`Java`中可以使⽤`//` 进⾏单⾏注释,请去除⼀段代码中的这种注释。
### 去除`/* 内容 */`注释
已知`Java`中可以使⽤`/* */` 进⾏多⾏注释,请去除代码中的这种注释。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论