一 概述
就是符合一定规则的字符串
二 常用规则
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:边界匹配器
^ 行的开头
$ 行的结尾
\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 次
三 常见功能
匹配、切割、替换、获取
四 匹配
// 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+", "");
八 获取
Pattern和Matcher
* 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());
}
}