黑马程序员——Java基础---正则表达式
2015-07-27 22:40
633 查看
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
正则表达式
概述
是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
特点:用于一些特定的符号来表示一些代码操作,这样可以简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符合定义越多,正则越长,阅读性越差。
规则字符在java.util.regex.Pattern类中
常见组成规则:字符、字符类、预定义字符类、边界匹配器、数量词
下面由实例来演示正则表达式与一般操作的比较。
演示用例:
QQ号码字符串的形式,验证QQ号码是不是合法,规则为:
全数字
0不能开头
长度限制 5位-11位
/*
* 写方法,验证QQ号码,正则表达式技术
*/
public static boolean checkQQ_Reg(String number){
return number.matches("[1-9][0-9]{4,10}");
}
/*
* 写方法,验证QQ号码是不是合法
*/
public static boolean checkQQ(String number){
//先判断长度
if(number.length() <5 || number.length()>11)
return false;
//判断0不能开头
if(number.startsWith("0"))
return false;
//判断全数字
char[] ch = number.toCharArray();
for(int x = 0 ; x < ch.length ;x++){
if(!Character.isDigit(ch[x]))
return false;
}
return true;
}
由实例我们可以看出,使用正则表达式大大的减少了我们代码书写的工作量,简化了书写。
常见符号
说明:X表示字符X或者匹配的规则。
1、字符
x 字符 x
\\ 反斜线字符
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
2、字符类
[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](减去)
3、预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
4、边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
5、Greedy数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n次
X{n,} X,至少 n次
X{n,m} X,至少 n次,但是不超过 m 次
6、组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。在替换中常用$匹配组的内容。
正则表达式的应用:
判断功能
public boolean matches(String regex)
/*
* 匹配数量词
*/
public static void method_1(){
//字符出现的次数匹配
String s = "abbbbbb";
boolean b = s.matches("ab{3,5}");
System.out.println(b);
}
/*
* 匹配字符类
*/
public static void method(){
//中间的字符必须是元音字母
String s = "beb";
boolean b = s.matches("b[^aeiuoAEIOU]b");
System.out.println(b);
//中间的字符只能数字
String s1 = "a1a";
b = s1.matches("a[\\d]a");
System.out.println(b);
//中间的字符是字母就行
String s2 ="0~0";
b = s2.matches("0[a-zA-Z]0");
System.out.println(b);
}
分割功能
public String[] split(String regex)
/*
* 正则表达式切割
* String类的方法split(正则规则)
* 方法按照写的规则对字符串进行切割,返回新的字符串数组
*/
public class RegexDemo {
public static void main(String[] args) {
String s = "192,168,33,,,11";
String[] str = s.split(",+");
for(int x = 0 ; x < str.length ;x++){
System.out.println(str[x]);
}
//文件路径的切割E:\2015\0704\day15\avi
String path = "E:\\2015\\0704\\day15\\avi";
//路径中的 \ 对字符串进行切割
//E: 2015 0704 存储到数组中
String[] str = path.split("\\\\"); //注意转义问题
for(int x = 0 ; x < str.length ;x++){
System.out.println(str[x]);
}
}
替换功能
public String replaceAll(String regex,String replacement)
第一个参数,写正则规则
第二个参数,被替换后的字符串
凡是字符串中符合规则的内容,都会被替换
public class RegexDemo1 {
public static void main(String[] args) {
String s = "he345llo332worte4w234ld";
//所有数字,替换成#
s = s.replaceAll("[0-9]", "*");
System.out.println(s);
//网页邮件提示:12345@sina*com*cn 发送右键# 改成@
}
获取功能
Pattern和Matcher类的使用
//1. 静态方法compile,预编译规则
Pattern p = Pattern.compile("\\b[a-zA-Z]{3}\\b");
//2. Pattern对象方法,matcher传递字符串,进行匹配
Matcher m = p.matcher("da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bur?");
//3. Matcher对象方法find找匹配后的结果
/*boolean b = m.find();
System.out.println(b);*/
//4 .Matcher类方法group获取查找后的结果
/*String s = m.group();
System.out.println(s);
m.find();
s = m.group();
System.out.println(s);*/
while(m.find()){
System.out.println(m.group());
}
}
测试用例:
1、字符串排序
/ * 实现步骤:
* 切割,空格
* String[] 0 91 1 27
* String[] 数组转成int[]数组
* Integer.parseInt(String s) -- int
* 排序int数组
* int数组变成字符串
*/
public static void stringSort(){
String s = "91 27 46 38 50";
//按照空格切割
String[] str = s.split(" +");
//获取字符串的数组 str 转成int数组
//创建int数组,长度必须和str长度一致
int[] arr = new int[str.length];
//遍历字符串数组,获取一个元素,转成int类型,存储int数组
for(int x = 0 ; x < str.length ;x++){
/*String ch = str[x];
int y = Integer.parseInt(ch);*/
arr[x] = Integer.parseInt(str[x]);
}
//int数组排序
for(int x = 0; x < arr.length ; x++){
for(int y = x + 1; y < arr.length ;y++){
if(arr[x] > arr[y]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
//将数组变成字符串打印
StringBuilder builder = new StringBuilder();
for(int x = 0 ; x < arr.length; x++){
if(x!=arr.length-1)
builder.append(arr[x]+" ");
else
builder.append(arr[x]);
}
String sort = builder.toString();
System.out.println(sort);
}
2、 电子邮件格式验证
/*匹配功能 String matches
* myabc@sina.com
* 3212343@qq.com
* zhangsan1990_01_30@163.com
* zhangsan1990_01_30@163.com.cn
*
* @前: 数字,字母(52)_
* @后: 数组,字母(52)
* .XX 字母,小写
*/
public static void checkEmail(){
String email = "myabc@sina.com.cn.gov";
boolean b = email.matches("[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-z]+)+");
System.out.println(b);
}
}
3、实现正则表达式的获取能
从一个字符串中,获取出规定好的内容
/* 使用java.util.regex.Pattern
* 使用java.util.regex.Matcher
*
*
* 实现步骤
* 1. Pattern类静态方法 compile(正则规则)
* 含义,方法将正则规则进行预编译
* 静态方法compile返回值是本类类型 Pattern
* 返回的是Pattern类的对象
*
* 2. 调用Pattern非静态方法 matcher(查找的字符串)
* 含义,将字符串和预先编译的正则规则,进行匹配
* matcher返回值是Matcher类类型
* 返回Matcher类的对象(Matcher类,叫做匹配器)
*
* 3. Matcher类对象find进行匹配后的查找,找的是规则和字符串匹配后的结果
* find返回值布尔类型
*
* 4. Matcher类方法 group 获取查找后的结果
* 方法返回String
*
* da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu
* 从这个字符串中,获取出三个字母的单词*/
import java.util.regex.*;
public class RegexDemo2 {
public static void main(String[] args) {
//1. 静态方法compile,预编译规则
Pattern p = Pattern.compile("\\b[a-zA-Z]{3}\\b");
//2. Pattern对象方法,matcher传递字符串,进行匹配
Matcher m = p.matcher("da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bur?");
//3. Matcher对象方法find找匹配后的结果
/*boolean b = m.find();
System.out.println(b);*/
//4 .Matcher类方法group获取查找后的结果
/*String s = m.group();
System.out.println(s);
m.find();
s = m.group();
System.out.println(s);*/
while(m.find()){
System.out.println(m.group());
}
}
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
正则表达式
概述
是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。其实就是一种规则。有自己特殊的应用。
特点:用于一些特定的符号来表示一些代码操作,这样可以简化书写。所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符合定义越多,正则越长,阅读性越差。
规则字符在java.util.regex.Pattern类中
常见组成规则:字符、字符类、预定义字符类、边界匹配器、数量词
下面由实例来演示正则表达式与一般操作的比较。
演示用例:
QQ号码字符串的形式,验证QQ号码是不是合法,规则为:
全数字
0不能开头
长度限制 5位-11位
/*
* 写方法,验证QQ号码,正则表达式技术
*/
public static boolean checkQQ_Reg(String number){
return number.matches("[1-9][0-9]{4,10}");
}
/*
* 写方法,验证QQ号码是不是合法
*/
public static boolean checkQQ(String number){
//先判断长度
if(number.length() <5 || number.length()>11)
return false;
//判断0不能开头
if(number.startsWith("0"))
return false;
//判断全数字
char[] ch = number.toCharArray();
for(int x = 0 ; x < ch.length ;x++){
if(!Character.isDigit(ch[x]))
return false;
}
return true;
}
由实例我们可以看出,使用正则表达式大大的减少了我们代码书写的工作量,简化了书写。
常见符号
说明:X表示字符X或者匹配的规则。
1、字符
x 字符 x
\\ 反斜线字符
\t 制表符 ('\u0009')
\n 新行(换行)符 ('\u000A')
\r 回车符 ('\u000D')
\f 换页符 ('\u000C')
\a 报警 (bell) 符 ('\u0007')
2、字符类
[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](减去)
3、预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
4、边界匹配器
^ 行的开头
$ 行的结尾
\b 单词边界
\B 非单词边界
\A 输入的开头
\G 上一个匹配的结尾
\Z 输入的结尾,仅用于最后的结束符(如果有的话)
\z 输入的结尾
5、Greedy数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n次
X{n,} X,至少 n次
X{n,m} X,至少 n次,但是不超过 m 次
6、组和捕获
捕获组可以通过从左到右计算其开括号来编号。例如,在表达式 ((A)(B(C)))中,存在四个这样的组:
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
组零始终代表整个表达式。在替换中常用$匹配组的内容。
正则表达式的应用:
判断功能
public boolean matches(String regex)
/*
* 匹配数量词
*/
public static void method_1(){
//字符出现的次数匹配
String s = "abbbbbb";
boolean b = s.matches("ab{3,5}");
System.out.println(b);
}
/*
* 匹配字符类
*/
public static void method(){
//中间的字符必须是元音字母
String s = "beb";
boolean b = s.matches("b[^aeiuoAEIOU]b");
System.out.println(b);
//中间的字符只能数字
String s1 = "a1a";
b = s1.matches("a[\\d]a");
System.out.println(b);
//中间的字符是字母就行
String s2 ="0~0";
b = s2.matches("0[a-zA-Z]0");
System.out.println(b);
}
分割功能
public String[] split(String regex)
/*
* 正则表达式切割
* String类的方法split(正则规则)
* 方法按照写的规则对字符串进行切割,返回新的字符串数组
*/
public class RegexDemo {
public static void main(String[] args) {
String s = "192,168,33,,,11";
String[] str = s.split(",+");
for(int x = 0 ; x < str.length ;x++){
System.out.println(str[x]);
}
//文件路径的切割E:\2015\0704\day15\avi
String path = "E:\\2015\\0704\\day15\\avi";
//路径中的 \ 对字符串进行切割
//E: 2015 0704 存储到数组中
String[] str = path.split("\\\\"); //注意转义问题
for(int x = 0 ; x < str.length ;x++){
System.out.println(str[x]);
}
}
替换功能
public String replaceAll(String regex,String replacement)
第一个参数,写正则规则
第二个参数,被替换后的字符串
凡是字符串中符合规则的内容,都会被替换
public class RegexDemo1 {
public static void main(String[] args) {
String s = "he345llo332worte4w234ld";
//所有数字,替换成#
s = s.replaceAll("[0-9]", "*");
System.out.println(s);
//网页邮件提示:12345@sina*com*cn 发送右键# 改成@
}
获取功能
Pattern和Matcher类的使用
//1. 静态方法compile,预编译规则
Pattern p = Pattern.compile("\\b[a-zA-Z]{3}\\b");
//2. Pattern对象方法,matcher传递字符串,进行匹配
Matcher m = p.matcher("da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bur?");
//3. Matcher对象方法find找匹配后的结果
/*boolean b = m.find();
System.out.println(b);*/
//4 .Matcher类方法group获取查找后的结果
/*String s = m.group();
System.out.println(s);
m.find();
s = m.group();
System.out.println(s);*/
while(m.find()){
System.out.println(m.group());
}
}
测试用例:
1、字符串排序
/ * 实现步骤:
* 切割,空格
* String[] 0 91 1 27
* String[] 数组转成int[]数组
* Integer.parseInt(String s) -- int
* 排序int数组
* int数组变成字符串
*/
public static void stringSort(){
String s = "91 27 46 38 50";
//按照空格切割
String[] str = s.split(" +");
//获取字符串的数组 str 转成int数组
//创建int数组,长度必须和str长度一致
int[] arr = new int[str.length];
//遍历字符串数组,获取一个元素,转成int类型,存储int数组
for(int x = 0 ; x < str.length ;x++){
/*String ch = str[x];
int y = Integer.parseInt(ch);*/
arr[x] = Integer.parseInt(str[x]);
}
//int数组排序
for(int x = 0; x < arr.length ; x++){
for(int y = x + 1; y < arr.length ;y++){
if(arr[x] > arr[y]){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}
}
}
//将数组变成字符串打印
StringBuilder builder = new StringBuilder();
for(int x = 0 ; x < arr.length; x++){
if(x!=arr.length-1)
builder.append(arr[x]+" ");
else
builder.append(arr[x]);
}
String sort = builder.toString();
System.out.println(sort);
}
2、 电子邮件格式验证
/*匹配功能 String matches
* myabc@sina.com
* 3212343@qq.com
* zhangsan1990_01_30@163.com
* zhangsan1990_01_30@163.com.cn
*
* @前: 数字,字母(52)_
* @后: 数组,字母(52)
* .XX 字母,小写
*/
public static void checkEmail(){
String email = "myabc@sina.com.cn.gov";
boolean b = email.matches("[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-z]+)+");
System.out.println(b);
}
}
3、实现正则表达式的获取能
从一个字符串中,获取出规定好的内容
/* 使用java.util.regex.Pattern
* 使用java.util.regex.Matcher
*
*
* 实现步骤
* 1. Pattern类静态方法 compile(正则规则)
* 含义,方法将正则规则进行预编译
* 静态方法compile返回值是本类类型 Pattern
* 返回的是Pattern类的对象
*
* 2. 调用Pattern非静态方法 matcher(查找的字符串)
* 含义,将字符串和预先编译的正则规则,进行匹配
* matcher返回值是Matcher类类型
* 返回Matcher类的对象(Matcher类,叫做匹配器)
*
* 3. Matcher类对象find进行匹配后的查找,找的是规则和字符串匹配后的结果
* find返回值布尔类型
*
* 4. Matcher类方法 group 获取查找后的结果
* 方法返回String
*
* da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu
* 从这个字符串中,获取出三个字母的单词*/
import java.util.regex.*;
public class RegexDemo2 {
public static void main(String[] args) {
//1. 静态方法compile,预编译规则
Pattern p = Pattern.compile("\\b[a-zA-Z]{3}\\b");
//2. Pattern对象方法,matcher传递字符串,进行匹配
Matcher m = p.matcher("da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bur?");
//3. Matcher对象方法find找匹配后的结果
/*boolean b = m.find();
System.out.println(b);*/
//4 .Matcher类方法group获取查找后的结果
/*String s = m.group();
System.out.println(s);
m.find();
s = m.group();
System.out.println(s);*/
while(m.find()){
System.out.println(m.group());
}
}
-----------android培训、java培训、java学习型技术博客、期待与您交流!------------
相关文章推荐
- 【剑指Offer面试题】 九度OJ1387:斐波那契数列
- 黑马程序员--JAVA<四题经典编程题>--
- 面试题的一些总结
- 面试:实现内存复制函数
- 面试题 —— 替换空格(ReplaceBlank)
- 黑马程序员----JAVA基础----泛型及工具类
- 程序员历练之路
- 程序员必读的六本书
- 程序员须知的基础算法整理
- 黑马程序员-ios学习笔记 oc 继承
- iOS 经典面试题
- 如何准备机器学习工程师的面试 ?
- 阿里一面的面试经历
- 面试题24_二叉搜索树的后序遍历序列
- [置顶] 程序员练级指南
- 海量数据处理面试题
- 剑指offer-面试题23.从上往下打印二叉树
- 面试题23_从上往下打印二叉树
- 程序员笔试面试算法题系列--数组
- 数据科学家可能成为2015年最热门职业