黑马程序员------------------正则表达式

来源:互联网 发布:火箭发动机 知乎 编辑:程序博客网 时间:2024/06/05 17:04
---------------------- ASP.Net+Android+IOS开发、.Net培训、期待与您交流! ----------------------

什么是正则表达式

    正则表达式可以针对字符串定义一种格式,可以用来检查字符串是否和这种格式匹配.

正则表达式
(1)正则表达式就是符合一定规则的字符串
(2)规则如下:
A:字符
x 字符 x
\\ 反斜线字符 
\n 换行符

B:字符类
[abc] a、b 或 c 
[^abc] 任何字符,除了 a、b 或 c 
[a-zA-Z] a 到 z 或 A 到 Z,两头的字母包括在内 
[0-9] 0到9的数字字符

C:预定义字符类
. 任何字符 
\d 数字:[0-9] 
\w 单词字符:[a-zA-Z_0-9] 

单词字符表示的是所有的字母字符和数字字符。
D:边界匹配器
^ 行的开头 
$ 行的结尾 
\b 单词边界

E:Greedy 数量词
X? X,一次或一次也没有 
X* X,零次或多次 
X+ X,一次或多次 
X{n} X,恰好 n 次 
X{n,} X,至少 n 次 
X{n,m} X,至少 n 次,但是不超过 m 次 

[1-9][0-9]{4,14}:1-9出现一次,至少4次,但是不超过14次 

F:组
在表达式 ((A)(B(C))) 中,存在四个这样的组: 从左到右计算其开括号来编号
(1)(A)(B(C))
(2)A
(3)B(C)
(4)C

\\1:表示获取第一组,在同一个字符串中
$1:表示获取第一组,在不同的字符串中
叠词:String regex = "(.)\\1+";
(3)正则的功能
A:匹配功能
用的是字符串类的matches方法
举例:判断qq号码,电话号码
B:切割功能
用的是字符串类的split方法
举例:"aa,bb,cc"
      "aa.bb.cc"
      "aa\\bb\\cc"
      "abcddddefgkkkkjhppppad" 叠词切割
C:替换功能
用的是字符串类的replaceAll方法
举例:把所有的数字替换成*号
D:获取功能
用的是Pattern类和Matcher类

步骤:
Pattern p = Pattern.compile(规则);
Matcher m = p.matcher(字符串);

find():是否有符号规则
group():如果有,则获取

举例:获取文本中的邮箱

package cn.itcast.test;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/*
 * 获取文本文件中的所有邮箱
 * 
 * 参照正则表达式的获取功能来实现。
 * 
 * 
 */
public class GetMail {
public static void main(String[] args) throws IOException {
// 邮箱的规则
String regex = "\\w+@\\w+(\\.\\w+)+";

// 读取文本文件
BufferedReader br = new BufferedReader(new FileReader("mail.txt"));
String line = null;
while ((line = br.readLine()) != null) {
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(line);
while (m.find()) {
System.out.println(m.group());
}
}
}
}

// 判断邮箱是否满足条件
// indexOf('@')!=-1
// String email = "xixi@sina.com.cn";
/*
 * abc@qq.com bcd@126.com ha1234ha@163.com xixi@sina.com.cn
 */
// 邮箱的规则
// String regex = "[a-zA-Z_0-9]+@[a-zA-Z_0-9]+(\\.[a-zA-Z_0-9]+)+";
/*
 * String regex = "\\w+@\\w+(\\.\\w+)+";
 * System.out.println(email.matches(regex));
 */

(4)案例:

A:我爱学编程

package cn.itcast.test;

/*
 * 我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程
 * 将字符串还原成:“我要学编程”。
 * 
 * 思路:
 *  1:去掉.
 *  2:叠词保留一个
 */
public class RegexTest {
public static void main(String[] args) {
String str = "我我....我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
// 去掉.
// 替换
String regex = "\\.";
String str2 = str.replaceAll(regex, "");
// System.out.println(str2);
// 叠词保留一个
String regex2 = "(.)\\1+";
String str3 = str2.replaceAll(regex2, "$1");
System.out.println(str3);

// String str = "我我..我..我...我.要...要要...要学....学学..学.编..编编.编.程.程.程..程";
// String regex = "((.)\\.*)(\\2\\.*)*";
// String s = str.replaceAll(regex, "$2");
// System.out.println(s);
}
}

B:IP地址排序
package cn.itcast.test;

import java.util.TreeSet;

/*
 * “192.168.3.23 202.10.34.2 3.3.3.3 127.0.0.1 80.12.23.34”。
 * 能将这些ip地址排序。按照地址段数值从小到大排序。
 * 
 * 思路:
 *  1:把字符串中的每个ip地址的每一段给补齐3位。在每一段的位置上前面都补2个0.
 *  2:如果这个ip地址段的这个值超出3位,将来保留后3位。
 */
public class RegexTest2 {
public static void main(String[] args) {
String ips = "192.168.3.23 202.10.34.2 3.3.3.3 127.0.0.1 80.12.23.34";

// 规则
// 补齐3位
String regex = "(\\d+)";
String ips2 = ips.replaceAll(regex, "00$1");
// System.out.println(ips2);

// 超过3位,保留后三位
String regex2 = "0*(\\d{3})";
String ips3 = ips2.replaceAll(regex2, "$1");
// System.out.println(ips3);

// 切割
String[] ipArray = ips3.split(" ");
TreeSet<String> ts = new TreeSet<String>();
for (String str : ipArray) {
// System.out.println(str);
ts.add(str);
}
//这个时候,字符串数组中已经保存每个ip地址。现在要进行排序。
//我建立TreeSet集合,存储每个字符串
StringBuilder sb = new StringBuilder();
for(String str : ts){
//去掉0
// System.out.println(str);
String regex3 = "0*(\\d+)";
String s = str.replaceAll(regex3, "$1");
// System.out.println(s);
sb.append(s).append(" ");
}
String lastIps = sb.toString().trim();
System.out.println(lastIps);
}
}
---------------ASP.Net+Android+IOS开发、.Net培训、期待与您交流!---------------详细请查看:http://edu.csdn.net
0 0
原创粉丝点击