黑马程序员-Java常见API案例小结III(正则表达式 )

来源:互联网 发布:淘宝 访问受限 编辑:程序博客网 时间:2024/05/18 02:07

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


Java正则表达式


一、概述

正则表达式是一种可以用于模式匹配和替换的规范。正则表达式使用单个字符串来描述、匹配一系列符合某个句法规则的字符串。在很多文本编辑器里,正则达表示通常被用来检索、替换那些符合某个模式的文本。

二、规则及应用

  • 字符串匹配
  • 字符串查找
  • 字符串替换
  • 字符串分割

1.常见规则

A:字符
x 字符 x。举例:'a'表示字符a
\\ 反斜线字符。
\n 新行(换行)符 ('\u000A') 
\r 回车符 ('\u000D')

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:边界匹配器
^ 行的开头
^java     条件限制为以Java为开头字符 
$ 行的结尾 
ava$     条件限制为以java为结尾字符
\b 单词边界
就是不是单词字符的地方。
举例:hello world?haha;xixi

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

2.常见功能:

A:判断功能
String类的public boolean matches(String regex)

B:分割功能
String类的public String[] split(String regex)

C:替换功能
String类的public String replaceAll(String regex,String replacement)

D:获取功能
Pattern和Matcher
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");

find():查找存不存在
group():获取刚才查找过的数据


3.常见应用
加入特定限制条件「[]」
[a-z]     条件限制在小写a to z范围中一个字符
[A-Z]     条件限制在大写A to Z范围中一个字符
[a-zA-Z] 条件限制在小写a to z或大写A to Z范围中一个字符
[0-9]     条件限制在小写0 to 9范围中一个字符
[0-9a-z] 条件限制在小写0 to 9或a to z范围中一个字符
[0-9[a-z]] 条件限制在小写0 to 9或a to z范围中一个字符(交集)

[]中加入^后加再次限制条件「[^]」
[^a-z]     条件限制在非小写a to z范围中一个字符
[^A-Z]     条件限制在非大写A to Z范围中一个字符
[^a-zA-Z] 条件限制在非小写a to z或大写A to Z范围中一个字符
[^0-9]     条件限制在非小写0 to 9范围中一个字符
[^0-9a-z] 条件限制在非小写0 to 9或a to z范围中一个字符
[^0-9[a-z]] 条件限制在非小写0 to 9或a to z范围中一个字符(交集)

在限制条件为特定字符出现0次以上时,可以使用「*」
J*     0个以上J
.*     0个以上任意字符
J.*D     J与D之间0个以上任意字符

在限制条件为特定字符出现1次以上时,可以使用「+」
J+     1个以上J
.+     1个以上任意字符
J.+D     J与D之间1个以上任意字符

在限制条件为特定字符出现有0或1次以上时,可以使用「?」
JA?     J或者JA出现

限制为连续出现指定次数字符「{a}」
J{2}     JJ
J{3}     JJJ
文字a个以上,并且「{a,}」
J{3,}     JJJ,JJJJ,JJJJJ,???(3次以上J并存)
文字个以上,b个以下「{a,b}」
J{3,5}     JJJ或JJJJ或JJJJJ
两者取一「|」
J|A     J或A
Java|Hello     Java或Hello
 
「()」中规定一个组合类型
比如,我查询<a href=/"index.html/">index</a>中<a href></a>间的数据,可写作<a.*href=/".*/">(.+?)</a>

在使用Pattern.compile函数时,可以加入控制正则表达式的匹配行为的参数:
Pattern Pattern.compile(String regex, int flag)

三、常见案例
1. 请验证该QQ号码 是否为正确的号码
长度 6-12位
  不以0开头
   都是数字
分析:
        1: 键盘输入QQ号码(字符串的QQ号码)
  2: 通过输入QQ号码, 验证长度是否合法
   是: 
   判断是否以数字0开头
   是:对不起,QQ号码无效,不能以0开头
   否: 
   判断每一位是否都是数字
  如果发现其中的哪一位不是数字,说明该QQ号码 无效
   如果都是数字,说明该QQ号码正确
  
  否:长度不足,请重新输入, 长度为 6-12位
代码实现:
package com.csdn.stringbuffer;/*分析: *  1: 键盘输入QQ号码(字符串的QQ号码) *  2: 通过输入QQ号码, 验证长度是否合法 *  是:  *  判断是否以数字0开头 *  是:对不起,QQ号码无效,不能以0开头 *  否:  *  判断每一位是否都是数字 *  如果发现其中的哪一位不是数字,说明该QQ号码 无效 *  如果都是数字,说明该QQ号码正确 *   *  否:长度不足,请重新输入, 长度为 6-12位 * */import java.util.Scanner;public class Test3 {public static void main(String[] args) {method1();method2();}private static void method2() {// 1: 键盘输入QQ号码(字符串的QQ号码)Scanner sc = new Scanner(System.in);System.out.println("请输入一个QQ号码:");// 获取键盘录入的字符串String qq = sc.nextLine();// 定义一个正则表达式, 它是一个字符串, 符合某种语法规则的字符串String regex = "[1-9][0-9]{5,11}";// 验证QQ号码boolean flag = qq.matches(regex);if (flag) {System.out.println("QQ合法");} else {System.out.println("QQ不合法");}}private static void method1() {// 1: 键盘输入QQ号码(字符串的QQ号码)Scanner sc = new Scanner(System.in);// 获取键盘录入的字符串String qq = sc.nextLine();boolean flag = true;// 2: 通过输入QQ号码, 验证长度是否合法if (qq.length() >= 6 && qq.length() <= 12) {// 判断是否以数字0开头if (qq.startsWith("0")) {System.out.println("对不起,QQ号码无效,不能以0开头");} else {// 判断每一位是否都是数字for (int i = 0; i < qq.length(); i++) {// 获取到每一位数据char ch = qq.charAt(i);if (ch >= '0' && ch <= '9') {// 正确} else {// 错误System.out.println("对不起,QQ号码必须都是数字");flag = false;break;// 退出当前循环}}}} else {System.out.println("长度不足,请重新输入, 长度为 6-12位");}if (flag) {// 正确的qq号码System.out.println("这是个正确的QQ号码");}}}

2.通过正则表达式验证 电子邮箱 是否正确
分析Li_Kepei@sina.com.cn
123456@qq.com
18500022116@163.com
18500022116@126.com
haha_Itcast@gmail.com
woshihaha@hotmail.com.cn
 
 
[a-zA-Z_0-9]+ @ [a-zA-Z_0-9]+ (\\.[a-zA-Z_0-9]+)+    
              \\w+   @    \\w+ (\\.\\w+)+
代码实现:
public class RegexDemo  {public static void main(String[] args) {//指定邮箱String email = "18500022116@126.com";//String email = "@.";//String email = "1@2.3";//指定规则String regex = "\\w+@\\w+(\\.\\w+)+";//验证boolean flag = email.matches(regex);System.out.println(flag);}}

3.需求: 我我我我我...想想想想想想...学学学学学...习习习习..Java
  结果: 我想学习Java

public class RegexDemo5 {public static void main(String[] args) {//指定数据String str = "我我我我........想想想想想想...学学学学学...习习习习..Java";//指定规则String regex = "(\\.)+";//替换String result = str.replaceAll(regex, "");System.out.println(result);//我我我我我想想想想想想学学学学学习习习习Java//指定规则//String regex2 = "我+想+学+习+Java";String regex2 = "(.)\\1+";//替换String result2 = result.replaceAll(regex2, "$1");//我想学习JavaSystem.out.println(result2);}}

4.需求: da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?
我要获取上面字符串中,由3个字母组成的单词,并打印

代码实现:
import java.util.regex.Matcher;import java.util.regex.Pattern;public class RegexDemo7 {public static void main(String[] args) {//指定数据//指定规则//使用规则//面向对象的正则表达式//1: 把正则表达式 封装成对象//String regex = "[a-zA-Z]{3}";String regex = "\\b[a-zA-Z]{3}\\b";Pattern p = Pattern.compile(regex);//2:使用对象 与 数据进行匹配, 产生匹配器对象(结果)String data = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";Matcher m = p.matcher(data);//3:通过匹配器对象(结果),获取想要的数据//判断是否有符合条件的数据    find()while(m.find()){//有 ,获取数据 group()System.out.println(m.group());}}}



0 0
原创粉丝点击