正则表达式
正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能:
1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
2,切割:String split();
3,替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
字符类 | |
---|---|
[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] (减去) |
Greedy 数量词 | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{ n} | X,恰好 n 次 |
X{ n,} | X,至少 n 次 |
X{ n, m} | X,至少 n 次,但是不超过 m 次 |
预定义字符类 | |
---|---|
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] 注意\d 是转义字符使用时要\\d 下面的都是这样 |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
注意\d 是特殊字符使用时要\\d使其变成转义字符 下面的都是这样 自己设置的转义字符都是 \.变成转义一个新的字符再\\.变成转义字符 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static void checkTel()
{
String tel =
"16900001111"
;
String telReg =
"1[358]\\d{9}"
;
System.out.println(tel.matches(telReg));
}
public static void demo()
{
String str =
"b23a23456789"
;
String reg =
"[a-zA-Z]\\d*"
;
boolean b= str.matches(reg);
System.out.println(b);
}
/*
需求:对邮件地址进行校验。
*/
public static void checkMail()
{
String mail = "
abc12@sina.com";
mail = "
1@1.1";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。 (\\.[a-zA-Z]+)+封装成组一次或多次
reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。
//mail.indexOf("@")!=-1
System.out.println(mail.matches(reg));
}
|
1
2
3
4
5
6
7
8
9
10
11
|
public static void splitDemo(String str,String reg)
{
//String reg = " +";//按照多个空格来进行切割
String[] arr = str.split(reg);
System.out.println(arr.length);
for
(String s : arr)
{
System.out.println(s);
}
}
splitDemo("zhangsan.lisi.wangwu","\\.");
splitDemo("c:\\abc\\a.txt","\\\\");
splitDemo("erkktyqqquizzzzzo","(.)\\1+");
//按照叠词完成切割。为了可以让规则的结果被重用
//可以将规则封装成一个组。用()完成。组的出现都有编号。
//从1开始。 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。注意要转义字 符所以\\1
|
1
2
3
4
5
6
|
public static void replaceAllDemo(String str,String reg,String newStr)
{
str = str.replaceAll(reg,newStr);
System.out.println(str);
}
String str = "wer1389980000ty1234564uiod234345675f";//将字符串中的数组替换成#。
replaceAllDemo(str,"\\d{5,}","#");
String str1 = "erkktyqqquizzzzzo";//. //将重叠的字符替换成单个字母。zzzz->z
replaceAllDemo(str1,"(.)\\1+","$1"); $是特殊字符可以表示组 若要使用$则用//$
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/*
正则表达式的第四个功能。
4,获取:将字符串中的符合规则的子串取出。
操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
*/
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str =
"ming tian jiu yao fang jia le ,da jia。"
;
System.out.println(str);
String reg =
"\\b[a-z]{4}\\b"
;
//将规则封装成对象。
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
System.out.println(m.matches());
//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
while
(m.find())
//将规则作用到字符串上,并进行符合规则的子串查找
{
System.out.println(m.group());
//(m.group());//用于获取匹配后结果。
System.out.println(m.start()+
"...."
+m.end());
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails_1();
}
public static void getMails_1()throws Exception
{
URLConnection conn = url.openConnection();
BufferedReader bufIn =
new
BufferedReader(
new
InputStreamReader(conn.getInputStream()));
String line =
null
;
String mailreg =
"\\w+@\\w+(\\.\\w+)+"
;
Pattern p = Pattern.compile(mailreg);
while
((line=bufIn.readLine())!=
null
)
{
Matcher m = p.matcher(line);
while
(m.find())
{
System.out.println(m.group());
}
}
}
|
正则表达式
正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
特点:用于一些特定的符号来表示一些代码操作。这样就简化书写。
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作。
弊端:符号定义越多,正则越长,阅读性越差。
具体操作功能:
1,匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false。
2,切割:String split();
3,替换:String replaceAll(regex,str);如果regex中有定义组,可以在第二参数中通过$符号获取正则表达式中的已有的组。
字符类 | |
---|---|
[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] (减去) |
Greedy 数量词 | |
---|---|
X? | X,一次或一次也没有 |
X* | X,零次或多次 |
X+ | X,一次或多次 |
X{ n} | X,恰好 n 次 |
X{ n,} | X,至少 n 次 |
X{ n, m} | X,至少 n 次,但是不超过 m 次 |
预定义字符类 | |
---|---|
. | 任何字符(与行结束符可能匹配也可能不匹配) |
\d | 数字:[0-9] 注意\d 是转义字符使用时要\\d 下面的都是这样 |
\D | 非数字: [^0-9] |
\s | 空白字符:[ \t\n\x0B\f\r] |
\S | 非空白字符:[^\s] |
\w | 单词字符:[a-zA-Z_0-9] |
\W | 非单词字符:[^\w] |
注意\d 是特殊字符使用时要\\d使其变成转义字符 下面的都是这样 自己设置的转义字符都是 \.变成转义一个新的字符再\\.变成转义字符 |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
public static void checkTel()
{
String tel =
"16900001111"
;
String telReg =
"1[358]\\d{9}"
;
System.out.println(tel.matches(telReg));
}
public static void demo()
{
String str =
"b23a23456789"
;
String reg =
"[a-zA-Z]\\d*"
;
boolean b= str.matches(reg);
System.out.println(b);
}
/*
需求:对邮件地址进行校验。
*/
public static void checkMail()
{
String mail = "
abc12@sina.com";
mail = "
1@1.1";
String reg = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";//较为精确的匹配。 (\\.[a-zA-Z]+)+封装成组一次或多次
reg = "\\w+@\\w+(\\.\\w+)+";//相对不太精确的匹配。
//mail.indexOf("@")!=-1
System.out.println(mail.matches(reg));
}
|
1
2
3
4
5
6
7
8
9
10
11
|
public static void splitDemo(String str,String reg)
{
//String reg = " +";//按照多个空格来进行切割
String[] arr = str.split(reg);
System.out.println(arr.length);
for
(String s : arr)
{
System.out.println(s);
}
}
splitDemo("zhangsan.lisi.wangwu","\\.");
splitDemo("c:\\abc\\a.txt","\\\\");
splitDemo("erkktyqqquizzzzzo","(.)\\1+");
//按照叠词完成切割。为了可以让规则的结果被重用
//可以将规则封装成一个组。用()完成。组的出现都有编号。
//从1开始。 想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取。注意要转义字 符所以\\1
|
1
2
3
4
5
6
|
public static void replaceAllDemo(String str,String reg,String newStr)
{
str = str.replaceAll(reg,newStr);
System.out.println(str);
}
String str = "wer1389980000ty1234564uiod234345675f";//将字符串中的数组替换成#。
replaceAllDemo(str,"\\d{5,}","#");
String str1 = "erkktyqqquizzzzzo";//. //将重叠的字符替换成单个字母。zzzz->z
replaceAllDemo(str1,"(.)\\1+","$1"); $是特殊字符可以表示组 若要使用$则用//$
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
/*
正则表达式的第四个功能。
4,获取:将字符串中的符合规则的子串取出。
操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
*/
import java.util.regex.*;
class RegexDemo2
{
public static void main(String[] args)
{
getDemo();
}
public static void getDemo()
{
String str =
"ming tian jiu yao fang jia le ,da jia。"
;
System.out.println(str);
String reg =
"\\b[a-z]{4}\\b"
;
//将规则封装成对象。
Pattern p = Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
System.out.println(m.matches());
//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
while
(m.find())
//将规则作用到字符串上,并进行符合规则的子串查找
{
System.out.println(m.group());
//(m.group());//用于获取匹配后结果。
System.out.println(m.start()+
"...."
+m.end());
}
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails_1();
}
public static void getMails_1()throws Exception
{
URLConnection conn = url.openConnection();
BufferedReader bufIn =
new
BufferedReader(
new
InputStreamReader(conn.getInputStream()));
String line =
null
;
String mailreg =
"\\w+@\\w+(\\.\\w+)+"
;
Pattern p = Pattern.compile(mailreg);
while
((line=bufIn.readLine())!=
null
)
{
Matcher m = p.matcher(line);
while
(m.find())
{
System.out.println(m.group());
}
}
}
|