---------- 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 | 输入的结尾 |
组是正则表达式用来封装部分正则的封装体 就跟函数体里封装的是代码一样 组可以内嵌 就跟类里面还可以封装类部类一样 每个组都有指针 通过指针操作组 指针0表示整个正则表达式 所以组的指针从1开始 在正则表达式内部调用组用\指针 由于要经过字窜转义所以写成\\指针 在参数列表内调用定一个正则表达式的组应该用$指针
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C))) 中,存在四个这样的组:
1 | ((A)(B(C))) |
2 | \A |
3 | (B(C)) |
4 | (C) |
正则表达式操作步骤:
1.按指定的模式将正则表达式编译封装成正则表达式对象
2.让正则表达式对象和要操作的字符串序列按模式执行匹配操作创建获取匹配引擎 也可以理解为让正则对象和要操作的字符串相关联,关联后,获取正则匹配引擎。
3.通过匹配器引擎对符合规则的子串进行操作,比如取出。
4.获取:将字符串中的符合规则的子串取出。
一些代码联系
package com.itheima;
import java.io.BufferedReader;
import java.io.FileReader;
import java.util.TreeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class SecretKey {
/**
* 需求: 将任意几段IP进行排序
*/
public static void getIps() {
String str = "192.168.218.131 10.1.1.1 20.1.1.20 ";
String[] ips = str.split(" +");// 分割出每个ip
String regex = "[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}";
TreeSet<String> ip = new TreeSet<String>();
for (int i = 0; i < ips.length; i++) {
if (!ips[i].matches(regex)) {// 验证ip的格式
System.out.println(ips[i] + " 不是一个有效的ip");
break;
}
ips[i] = ips[i].replaceAll("(\\d+)", "00$1");// 将每个ip个各个字段都保证至少是三位
ips[i] = ips[i].replaceAll("0*(\\d{3})", "$1");
ip.add(ips[i]);
}
System.out.println(ip);
}
/**
* 需求: 将下列字符串转成:我要学编程.
*/
static void textFormat() {
String str = "我我...我 我我...我 要要..要 要...要要...学"
+ "学学....学学...编.......编 编...编程..程.程程...程...程";
// 可以先把.和空格去掉在把重复的字编程单个的字
str = str.replaceAll("\\.", "");
System.out.println("去掉所有的点之后:" + str);
str = str.replaceAll(" +", "");
System.out.println("去掉所有的空格之后:" + str);
str = str.replaceAll("(.)\\1+", "$1");
System.out.println("去掉所有的叠词之后:" + str);
}
/**
* 需求: 验证手机号码
*/
static void checkPhone() {
String phone = "18766500058";
String regex = "1[3458]\\d{9}";
System.out.println(phone.matches(regex));
}
/**
* 需求:得到一个文件中所有的邮箱
*/
static void getEmails() throws Exception {
BufferedReader bfr = new BufferedReader(new FileReader("d://1.txt"));
String regex = "[0-9a-zA-Z_]+@\\w+(\\.+\\w+){1,2}";
String line;
Pattern p = Pattern.compile(regex);
while ((line = bfr.readLine()) != null) {
Matcher m = p.matcher(line);
while (m.find()) {
System.out.println(m.group());
}
}
}
public static void main(String[] args) throws Exception {
System.out.println("------格式化文字------");
textFormat();
System.out.println("------验证一个手机号码------");
checkPhone();
System.out.println("------把给定的几个ip进行排序------");
getIps();
System.out.println("------得到一个文件中所有的ip------");
getEmails();
}
}