18.正则表达式
AI-摘要
Tianli GPT
AI初始化中...
介绍自己 🙈
生成本文简介 👋
推荐相关文章 📖
前往主页 🏠
前往爱发电购买
18.正则表达式
Pupper一、正则表达式
1. 常用类
Pattern 类 :
- pattern 对象是一个正则表达式对象, 没有公共构造方法, 通过调用器公共方法, 返回 pattern 类;
- 该方法接收一个正则表达式作为他的第一个参数
- Pattern pattern = Pattern.compile(regStr);
Matcher 类:
- Matcher 对象是对输入的字符串进行匹配, 没有公共的构造方法,
- 需要调用 Pattern 对象的 matcher 方法获取一个 Matcher 对象;
- Matcher matcher = pattern.matcher(content);
PatternSyntaxException : 表示正则表达式的语法错误;
2.使用方法
使用步骤:
- 创建 正则表达式的匹配模式
Pattern.compile("\\(")
;
- 根据 匹配模式创建匹配器, 匹配字符串
pattern.matcher(content)
;
- 使用 while 循环进行匹配
matcher.find()
: 找到 返回 true, 找到返回 false;matcher.group(0)
: 将匹配的结果输出; 1. 没有分组时, 使用 group(0) 输出匹配结果; 1. 有分组时, 0 为本次匹配的结果, 1 为匹配结果的第一个分组, 2 为第二个分组, 以此类推;
1 | public class RegexpDemo1 { |
3. matchers 整体匹配
matchers() : 可用于 字符串 和 匹配规则的整体匹配, 匹配成功, 返回 true, 否则, 返回 false
1 | // Pattern.matchers 整体匹配 |
二、元字符
1. 转义号 - \
转义号 \ : 在使用正则表达式去检索某些特殊字符时, 需要用到转义号, 否则会检索不到结果或报错; *在 java 中, 两个 \ 代表其他语言中的 一个 \
1 | public class RegexpDemo1 { |
2. 字符匹配符
符号 | 说明 | 实例 | 解释 |
---|---|---|---|
[ ] | 可匹配的字符列表 | [efgh] | e、f、g、h 中的任意一个字符 |
不可的匹配字符列表 | abc | 除了 a、b、c 之外的任意一个字符 | |
- | 连字符 | A-Z | 任意一个大写字母 |
. | 匹配除了 \n 以外的任意字符 | a..b | 以 a 开头, 以 b 结尾, 长度为 4 个字符的字符串 |
\\d | 匹配单个数字字符, 等价于[0-9] | \\d{3}(\\d)? | 包含 3 或 4 个数字的字符串 |
\\D | 匹配单个非数字字符, 等价于0-9 | \\D(\\d)* | 以非数字开头, 后面接任意个数字的字符串 |
\\w | 匹配单个数字、大小写字母、下划线字符, 等价于[0-9a-zA-Z_] | \\d{3}\\w{4} | 以 3 个数字开头, 后面接非特殊字符, 长度为 7 的字符串 |
\\W | 匹配单个非数字、大小写字母、下划线字符, 等价于0-9a-zA-Z_ | \\W+\\d{2} | 以至少一个特殊字符开头, 2 个数字结尾的字符串 |
\\s | 匹配单个空格、制表符 | \\s+\\s | 匹配字符串前后空格 |
\\S | 匹配单个 非空格、制表符, 等价于\\\\s | \\S | 匹配除空格外的任意单个字符 |
- [a-z] : 表示可以匹配 a-z 中任意一个字符;
- java 中 正则表达式默认区分大小写, 可以使用
**(?i)**
表示不区分大小写:Pattern.compile("\\(", Pattern.CASE_INSENSITIVE)
Pattern.CASE_INSENSITIVE
: 表示该匹配规则 不区分大小写;
- (?i)abc : 表示 abc 不区分大小写;
- a(?i)bc : 表示 bc 不区分大小写;
- a((?i)b)c : 表示 b 不区分大小写;
3. 选择匹配符
符号 | 说明 | 实例 | 解释 |
---|---|---|---|
| | 匹配 “|” 之前或之后的字符串 | ab|cd | 匹配 ab 或 cd |
4. 限定符
- java 中, 正则匹配默认为 贪婪匹配(尽可能多的匹配)_** , 会尽可能匹配多的内容;
- 当 ? 和 其他限定符号一起使用时, 则为 **非贪婪匹配(尽可能少的匹配) ;
符号 | 说明 | 实例 | 解释 |
---|---|---|---|
_ | 指定字符重复任意次数 | (abc)_ | 仅包含 任意个 abc 的字符串, 等价于\\w* |
+ | 指定字符重复至少一次 | m+(abc)* | 以至少 1 个 m 开头, 后接任意个 abc 的字符串 |
? | 指定字符重复 0 次或 1 次 | m+abc? | 以至少 1 个 m 开头, 后接 ab 或 abc 的字符串 |
{n} | 只能匹配 n 个字符 | [abcd]{3} | 由 abcd 中任意 3 个字母组成的字符串 |
{n,} | 指定至少 n 个字符 | [abcd]{3,} | 由 abcd 中任意至少 3 个字母组成的字符串 |
{n,m} | 指定至少 n 个,至多 m 个字符 | [abcd]{3, 5} | 由 abcd 中任意至少 3 个至多 5 个字母组成的字符串 |
1 | // ? 和 其他限定符号一起使用时, 为非贪婪模式 |
5. 定位符
符号 | 说明 | 实例 | 解释 |
---|---|---|---|
^ | 指定其实位置 | ^[0-9]+[a-z]* | 以至少 1 个数字开头, 后接任意个小写字母 |
$ | 指定结束位置 | ^[0-9]\\\\-[a-z]+$ | 以 1 个数字开头, 接-, 接 至少 1 个字母结尾 |
\\b | 匹配目标字符串的边界 | han\\b | han 后接空格或者字符串结束位置的 han |
\\B | 匹配目标字符串的非边界 | han\\B | han 后没有空格或不是字符串结束位置的 han |
- 字符串边界: 指字符串中的空格 或者 结尾;
三、分组
常用分组构造形式 | 说明 | 备注 |
---|---|---|
(pattern) | 非命名分组 | 0 : 表示由整个正则表达式匹配的文本 n : 表示其他正则规则匹配的结果, 从 1 开始编号 |
(?<name>pattern) | 命名分组 | - 将匹配的子字符串用一个名称或编号命名; - 用于 命名的 字符串不能有任何标点符号, 不能以数字开头 - 可以使用 ‘’ 单引号 代替 尖括号 <> |
非分组匹配, 不能使用 matcher.group(1)
常用分组构造形式 | 说明 | 备注 |
---|---|---|
(?:pattern) | 非分组匹配 | - 匹配 pattren, 但不捕获该匹配的子表达式; - 即它是一个非捕获匹配, 不存储供以后使用的匹配; - 对于 or 字符 (|) 组合模式部件的情况很有用 - 如 industr(?:y|ies) - 等价于 industry|industries |
(?=pattern) | 非分组匹配 | - 如: Windows (?=95|98|NT|2000) - 匹配 “Windows 2000” 中的 windows - 但不匹配 “Windows 3.1” 中得 windows |
(?!pattern) | 非分组匹配 | - 如: Windows (?!95|98|NT|2000) - 匹配 “Windows 3.1” 中的 windows, - 但不匹配 “Windows 2000” 中得 windows |
1 | public class RegexpDemo2 { |
四、反向引用
- 分组: 用圆括号组成一个比较复杂的匹配模式, 圆括号的部分就可以看做为一个分组或一个子表达式;
- 捕获: 将匹配到的内容存放在内存中, 0 表示整个表达式匹配的内容, 1 表示第一个分组的内容, 以此类推;
- 反向引用 : 圆括号匹配的内容, 在该括号后被使用的模式;
- 反向引用即可以在表达式内部, 也可以在表达式外部:
- 表达式内部: \分组号
- 表达式外部: $分组号
1 | public class RegexpDemo2 { |
五、案例
1 | // 使用正则表达式, 直接操作字符串 - 案例 |
1 | // 正则 - 案例 |
六、常用正则表达式
1 | 一、校验数字的表达式 |
评论
匿名评论隐私政策
✅ 你无需删除空行,直接评论以获取最佳展示效果