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

来源:互联网 发布:为了抵御网络黑客攻击 编辑:程序博客网 时间:2024/05/18 01:52
------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