黑马程序员 Java基础 正则表达式

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

一 概述 

就是符合一定规则的字符串

 

二 常用规则

A:字符

字符 x。举例:'a'表示字符a

\\ 反斜线字符。

\n 新行(换行)符 ('\u000A') 

\r 回车符 ('\u000D')

B:字符类

[abc] a或 c(简单类) 

[^abc] 任何字符,除了 a或 c(否定) 

[a-zA-Z] a到 或 A到 Z,两头的字母包括在内(范围) 

[0-9] 09的字符都包括

C:预定义字符类

任何字符。我的就是.字符本身,怎么表示呢? \.

\d 数字:[0-9]

\w 单词字符:[a-zA-Z_0-9]

在正则表达式里面组成单词的东西必须有这些东西组成

 

D:边界匹配器

行的开头 

行的结尾 

\b 单词边界

就是不是单词字符的地方。

举例:hello world?haha;xixi

E:Greedy 数量词 

X?  X一次或一次也没有

X*  X零次或多次

X+  X一次或多次

X{n}  X恰好 次 

X{n,}  X至少 次 

X{n,m}  X至少 次,但是不超过 次 

 

三 常见功能

匹配、切割、替换、获取

 

四 匹配

// public boolean matches(String regex)

// 告知此字符串是否匹配给定的正则表达式

 

代码1

boolean b = "13436975980".matches("1[38]\\d{9}");

第一位是1,第二位是3或者8,后面9位都是数字

代码2

boolean b2 = "linqingxia@126.com".matches("\\w+@\\w{2,6}(\\.\\w{2,3})+");

单词字符一位或者多位,@,单词字符2-6位,一个或者多个(“.”,2-3位单词字符)

 

五 切割

// public String[] split(String regex)

// 根据给定正则表达式的匹配拆分此字符串。 

 

代码1

String[] strArray = "18-24".split("-");

String[] strArray2 = "aa,bb,cc".split(",");

String[] strArray3 = "aa.bb.cc".split("\\.");

String[] strArray4 = "aa   bb          cc".split(" +");

String[] strArray5 = "E:\\JavaSE\\day14\\avi".split("\\\\");

 

案例:

/*

 * 我有如下一个字符串:"91 27 46 38 50"

 * 请写代码实现最终输出结果是:"27 38 46 50 91"

 */

public static void main(String[] args) {

String[] strArray = "91 27 46 38 50".split(" ");

 

int[] arr = new int[strArray.length];

for(int i = 0; i < arr.length; i++){

arr[i] = Integer.parseInt(strArray[i]);

}

 

Arrays.sort(arr);

 

StringBuilder sb = new StringBuilder();

for(int j = 0; j < arr.length; j++){

sb.append(arr[j]).append(" ");

}

 

System.out.println(sb.toString().trim());

}



 

六 正则中的复用:用()封装

1

[ ] 封装内容。

  { } 封装次数。 

( ) 封装复用的内容

 

2在使用()封装时,子偶顶给()编号,从1开始,称为正则表达式中的组。通过组的编号就可以调用指定的组,进行复用。

 

3组的嵌套

例  如:( ( A ( B ( D ) ) ) )

\\1 (第一组) ( ( A ( B ( D ) ) ) )

\\2 ( A )

\\3 (  B ( D ) )

\\4 ( D )

\\0 代表整个嵌套组。组0代表整个表达式

 

4)案例

代码:

// regex也可以写成"(.)(\\1)+"

String[] strs = "lily%%%%%%lucy&&&&&&&&&&kate".split("(.)\\1+");

 

七 替换

// String类的public String replaceAll(String regex,String replacement)

// 使用给定的 replacement 替换此字符串所有匹配给定的正则表达式的子字符串。 

 

Stirng result = "helloqq12345worldkh622112345678java".replaceAll("\\d+", "");
 

八 获取

PatternMatcher

 * Pattern :

 * 正则表达式的编译表示形式。 

 * 指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建 Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。 

 

代码1

 * 模式和匹配器的基本使用顺序

public static void main(String[] args) {

// 模式和匹配器的典型调用顺序

// 把正则表达式编译成模式对象

Pattern p = Pattern.compile("a*b");

// 通过模式对象得到匹配器对象.传入被匹配的字符串

Matcher m = p.matcher("aaaaab");

// 调用匹配器对象的功能

boolean b = m.matches();

System.out.println(b);

 

// 当然如果做判断,太复杂了,完全可以下面这样子

System.out.println("aaaaab".matches("a*b"));  // 返回true

}



 

find():查找存不存在

group():获取刚才查找过的数据

代码2

 * 获取功能:

 * 获取下面这个字符串中由三个字符组成的单词

 * da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?

 

public static void main(String[] args) {

String s = "da jia ting wo shuo,jin tian yao xia yu,bu shang wan zi xi,gao xing bu?";

String regex = "\\b\\w{3}\\b"; // \\b的使用!!!

 

Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(s);

 

 public boolean find()

//boolean flag = m.find();

//System.out.println(flag);

 

 public String group()

//      String ss = m.group(); // 注意:一定要先find(),然后才能group()

//System.out.println(ss);

 

while(m.find()){

System.out.println(m.group());

}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值