------- android培训、java培训、期待与您交流! ---------
正则表达式:符合一定规则的操作字符串的表达式
特点:将操作字符串的代码封装成特定字符 由特定字符组成正则表达式。这样可以简化代码的书写。。。。
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
正则字符
构造 匹配
字符 | |
---|---|
x | 字符 x |
\\ | 反斜线字符 |
\0n | 带有八进制值 0 的字符 n (0 <= n <= 7) |
\0nn | 带有八进制值 0 的字符 nn (0 <= n <= 7) |
\0mnn | 带有八进制值 0 的字符 mnn(0 <= m <= 3、0 <= n <= 7) |
\xhh | 带有十六进制值 0x 的字符 hh |
\uhhhh | 带有十六进制值 0x 的字符 hhhh |
\t | 制表符 ('\u0009') |
\n | 新行(换行)符 ('\u000A') |
\r | 回车符 ('\u000D') |
\f | 换页符 ('\u000C') |
\a | 报警 (bell) 符 ('\u0007') |
\e | 转义符 ('\u001B') |
\cx | 对应于 x 的控制符 |
字符类 | |
[abc] | a、b 或 c(简单类) |
[^abc] | 任何字符,除了 a、b 或 c(否定) |
[a-zA-Z] | a 到 z 或 A 到 Z,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p:[a-dm-p](并集) |
[a-z&&[def]] | d、e 或 f(交集) |
[a-z&&[^bc]] | a 到 z,除了 b 和 c:[ad-z](减去) |
[a-z&&[^m-p]] | a 到 z,而非 m 到 p:[a-lq-z](减去) |
预定义字符类 | |
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
边界匹配器 | |
---|---|
^ | 行的开头 |
$ | 行的结尾 |
\b | 单词边界 |
\B | 非单词边界 |
\A | 输入的开头 |
\G | 上一个匹配的结尾 |
\Z | 输入的结尾,仅用于最后的结束符(如果有的话) |
\z | 输入的结尾 |
正则表达式中具有特定意义的字符注意一定的转义 如果没有在字符串的转义里定义就得经过2次转义。。
正则表达式中.代表所有字符的意思 所有你不想让它代表所有字符的意思的话可以写到一对中括号内如[.] 也可以用转义字符转义 如果要转义的话要用2个转义字符如\\.
\.这样写编译不会通过因为正则表达式是写在字符串内的 字符串检测到子窜里有转义符所有就会先被字符串转义而字符串转义里面没有\. 所有编译器不识别报错。。
\\.先被字符串转义成\. 在经过正则表达式转义 所有在字符串转义里面没有的要经过2次转义 而字符串转义里面已定义的只要被字符串转义就可以了 正则表达式里面可以转义也可以不转义 如\\n和\n 都是可以的
组是正则表达式用来封装部分正则的封装体 就跟函数体里封装的是代码一样 组可以内嵌 就跟类里面还可以封装类部类一样 每个组都有指针 通过指针操作组 指针0表示整个正则表达式 所以组的指针从1开始 在正则表达式内部调用组用\指针 由于要经过字窜转义所以写成\\指针 在参数列表内调用定一个正则表达式的组应该用$指针
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 ((A)(B(C))) 2 \A 3 (B(C)) 4 (C)
组零始终代表整个表达式。
正则表达式操作步骤: 当然头前3个功能也可以不完全按照这个来直接操作String或Pattern类也可以 如果是地4个功能或其他功能就要按照这个来了
1.按指定的模式将正则表达式编译封装成正则表达式对象
通过Pattern类的compile方法
static Pattern | compile(String regex) 将给定的正则表达式编译到模式中。 |
static Pattern | compile(String regex, int flags) 将给定的正则表达式编译到具有给定标志的模式中。 |
2. 让正则表达式对象和要操作的字符串序列按模式执行匹配操作创建获取匹配引擎 也可以理解为让正则对象和要操作的字符串相关联,关联后,获取正则匹配引擎。
通过Pattern类的matcher方法
Matcher | matcher(CharSequence input) 创建匹配给定输入与此模式的匹配器。 |
3.通过匹配器引擎对符合规则的子串进行操作,比如取出。
具体操作功能:
1,匹配:用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
String类
boolean | matches(String regex) 告知此字符串是否匹配给定的正则表达式。 |
Pattern类
static boolean | matches(String regex,CharSequence input) 编译给定正则表达式并尝试将给定输入与其匹配。 |
Matcher类
boolean | matches() 尝试将整个区域与模式匹配。 |
String类和Pattern类的matches方法调用的是Matcher类的matches方法 被String 和Pattern的方法封装后,用起来较为简单。但是功能不够多。就如Math类的random方法调用的Random类的nextDoube 它只能直接生产0到1的双精度小数 Random的方法丰富的多可以直接生成整数boolean等其他类型的数
2,切割:用规则匹配整个字符串,获取不符合规则的子窜
String类
String[] | split(String regex) 根据给定正则表达式的匹配拆分此字符串。 |
String[] | split(String regex, int limit) 根据匹配给定的正则表达式来拆分此字符串。 |
Pattern类
String[] | split(CharSequence input) 围绕此模式的匹配拆分给定输入序列。 |
String[] | split(CharSequence input, int limit) 围绕此模式的匹配拆分给定输入序列。 |
3,替换:用规则匹配整个字符串 按条件用新的子窜替换符合规则的子窜 replacement为新的子窜
String |
使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 |
String | replaceFirst(String regex,String replacement) 使用给定的 replacement 替换此字符串匹配给定的正则表达式的第一个子字符串。 |
| |
|
4,获取:将字符串中的符合规则的子串取出。
Matcher类
当没执行find方法是不能执行group start end方法的还有其他方法也不能执行具体什么方法可以查api或者Eclipse上试 如果你没执行find 方法执行了这几种方法会抛IllegalStateException异常 该异常extendsRuntimeException 在非法或不适当的时间调用方法时产生的信号。换句话说,即 Java 环境或 Java 应用程序没有处于请求操作所要求的适当状态下。
这个机制跟迭代器的hasNext()方法很像 不同之处在于你不执行迭代器的hasNext方法 也可以执行next方法 前提迭代器里有数据不然也会是运行期错误。而matcher的那几个方法需要用到执行find后的指针 所以没find是会报错的 而且你操作了指针方法掉完以后 指针还会在你调用的地方不会自动返回到调用之前这跟迭代器一样。 Matcher对象需要通过reset方法重置指针或从指定的指针开始 这点上迭代器没有设置或重置指针的方法如果非要说有的话就得重新搞个迭代器 而且当有多个迭代器操作同个容器只能用一个迭代器操作容器的元素 用多个操作会导致快速失败异常 当然带参数的ListIterator除外。。。。
reset 和头前3个功能的方法没执行find 是是可以执行的
boolean | find() 尝试查找与该模式匹配的输入序列的下一个子序列。 |
boolean | find(int start) 重置此匹配器,然后尝试查找匹配该模式、从指定索引开始的输入序列的下一个子序列。 |
String | group() 返回由以前匹配操作所匹配的输入子序列。 |
String | group(int group) 返回在以前匹配操作期间由给定组捕获的输入子序列。 |
int | start() 返回以前匹配的初始索引。 |
int | start(int group) 返回在以前的匹配操作期间,由给定组所捕获的子序列的初始索引。 |
int | end() 返回最后匹配字符之后的偏移量。 |
int | end(int group) 返回在以前的匹配操作期间,由给定组所捕获子序列的最后字符之后的偏移量。 |
| |
|