java正则表达式
2008-03-29 23:53
267 查看
正则表达主要用的是java.util.regex 包中的主要两个类
Matcher和Pattern
matches方法用来判断整个字符串有没有匹配
一.Pattern 匹配模式
[a-z]{3} []里是匹配的字符
{}里表示出现的个数
例子:
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("xyz");
System.out.println(m.matches());有没有符合条件
或者直接一句话写
System.out.println("fgh".matches("[a-z]{3}"));
不过效率没有上面的高。
二." . * + ?"特殊字符
. :点表示一个字符
* :星表示0个或多个
+ :加表示一个或多个
? :问号表示0个或一个
[] 表示一个范围内的值,只匹配其中一个
[^]:表示这个范围内的除外匹配
^ :不在[]里的,表示一行的开始
{n}:大括号表示出现的个数
{n,}最少出现n个最多无数个
{n,m}最少出现n个最多出现m个
"":空串表示0次
1.[] 表示一个范围内的值,只匹配其中一个
^:取非 即除此之外的内容
|:或者
&&:并且
例子:
p("a".matches("[abc]"));
p("a".matches("[^abc]")); //不匹配,表示abc除外
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z[A-Z]]"));
p("R".matches("[A-Z&&[RFG]]"));
2.认识/s /w /d /
/s 空白字符
/d 数字字符
/w 由[a-zA-Z_0-9]组成的字符 如:
以上的大写表达即为取非 如/D 非数字字符
例子:
p(" /n/r/t".matches("//s{4}")); //匹配 因为是4个空白字符
p(" ".matches("//S")); //不匹配S是非空白
p("a_8".matches("//w{3}"));
p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+"));
p("//".matches("////")); //正则表达式中用/开始,java也要加/,再与前面匹配
3.POSIX风格
p("a".matches("//p{Lower}")
4.边界 开头和结尾
^ :表示开头,不在[]里的表示一行的开始
$ :表示结尾
/b:表示单词边界,一般以空格为边界
p("hello sir".matches("^h.*")); //匹配 表示以h开头,字符有一个或者多个
p("hello sir".matches(".*ir$")); //匹配 表示字符是一个或多个且要以ir结尾
p("hello sir".matches("^h[a-z]{1,3}o//b.*")); //匹配 有单词边界
p("hellosir".matches("^h[a-z]{1,3}o//b.*")); //不匹配,没有边界
//whilte lines
p(" /n".matches("^[//s&&[^//n]]*//n$")); //空白行:空白且不换行,再出现0到多次,且换行结尾
p("aaa 8888c".matches(".*//d{4}."));
p("aaa 8888c".matches(".*//b//d{4}."));
p("aaa8888c".matches(".*//d{4}."));
p("aaa8888c".matches(".*//b//d{4}."));//不匹配,没有边界
5.Email地址匹配
p("]+@[//w[.-]]+//.[//w]asd_sf@dsdfsdf.com".matches("[//w[.-]]+@[//w[.-]]+//.[//w]+"));
6.查找匹配字串
Pattern p = Pattern.compile("//d{3,5}");
String s = "123-34345-234-00";
Matcher m = p.matcher(s);
p(m.matches()); //读到123-就判断不匹配,再find则从1234-后面的字符查找匹配
m.reset(); //再从头开始
p(m.find()); //条件匹配字串
p(m.lookingAt()) //每次从头开始找
7.start和end 起始位置和结束位置
前提是必须查找到子串
p(m.find());
p(m.start() + "-" + m.end()); 输出0-3
8.字符串的替换
Pattern.CASE_INSENSITIVE表示忽略大小写
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
while(m.find()) {
//p(m.replaseAll("JAVA")) 把全部有java的替换成大写
i++;
if(i%2 == 0) {//把单数的大写,双数的小写
m.appendReplacement(buf, "java");
} else {
m.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf); //添加尾巴字符串
p(buf);
9.分组
把正则表达式用()括起来就是分组
Pattern p = Pattern.compile("(//d{3,5})([a-z]{2})");
String s = "123aa-34345bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印所有
p(m.group(1)); //打印数字的
p(m.group(2)); //打印字母的
}
三.正则表达式的高级部分
1.quantifier数量词 有三种情况
Greedy 数量词
正常的正则表达式,从最大值开始
如{2,10},先从10开始,不匹配从后减少至匹配输出
Reluctant 数量词(懒惰)
表达式后加 ?
从最小值开始
如{2,10},先从2开始,不匹配从头开始增加至匹配输出
Possessive 数量词(独占)
表达式加 +
也是从最大值开始,不过不匹配不减少。直接退出
2.non-capturing groups (非捕获组)
加(?=X):即不捕获X
用法:放在前面算在其中,放在后天不算在其中
例:
Pattern p = Pattern.compile(".{3}(?=a)");
String s = "444a66b";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印输出444因为它不捕获a
}
3.向后引用
(组)//n 即前面找到组的第n个组,要和后面剩下的匹配
Pattern p = Pattern.compile("(//d(//d))//2");
String s = "122";
Matcher m = p.matcher(s);
p(m.matches()); //匹配,因为前面找到的第二个级是2和后面剩下的2匹配
4.flags的简写
?i :打开大小写忽略,相当于加入Pattern.CASE_INSENSITIVE
例:
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
p("Java".matches("(?i)(java)"));和上面实现的功能一样。
正则表达主要用的是java.util.regex 包中的主要两个类
Matcher和Pattern
matches方法用来判断整个字符串有没有匹配
一.Pattern 匹配模式
[a-z]{3} []里是匹配的字符
{}里表示出现的个数
例子:
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("xyz");
System.out.println(m.matches());有没有符合条件
或者直接一句话写
System.out.println("fgh".matches("[a-z]{3}"));
不过效率没有上面的高。
二." . * + ?"特殊字符
. :点表示一个字符
* :星表示0个或多个
+ :加表示一个或多个
? :问号表示0个或一个
[] 表示一个范围内的值,只匹配其中一个
[^]:表示这个范围内的除外匹配
^ :不在[]里的,表示一行的开始
{n}:大括号表示出现的个数
{n,}最少出现n个最多无数个
{n,m}最少出现n个最多出现m个
"":空串表示0次
1.[] 表示一个范围内的值,只匹配其中一个
^:取非 即除此之外的内容
|:或者
&&:并且
例子:
p("a".matches("[abc]"));
p("a".matches("[^abc]")); //不匹配,表示abc除外
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z[A-Z]]"));
p("R".matches("[A-Z&&[RFG]]"));
2.认识/s /w /d /
/s 空白字符
/d 数字字符
/w 由[a-zA-Z_0-9]组成的字符 如:
以上的大写表达即为取非 如/D 非数字字符
例子:
p(" /n/r/t".matches("//s{4}")); //匹配 因为是4个空白字符
p(" ".matches("//S")); //不匹配S是非空白
p("a_8".matches("//w{3}"));
p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+"));
p("//".matches("////")); //正则表达式中用/开始,java也要加/,再与前面匹配
3.POSIX风格
p("a".matches("//p{Lower}")
4.边界 开头和结尾
^ :表示开头,不在[]里的表示一行的开始
$ :表示结尾
/b:表示单词边界,一般以空格为边界
p("hello sir".matches("^h.*")); //匹配 表示以h开头,字符有一个或者多个
p("hello sir".matches(".*ir$")); //匹配 表示字符是一个或多个且要以ir结尾
p("hello sir".matches("^h[a-z]{1,3}o//b.*")); //匹配 有单词边界
p("hellosir".matches("^h[a-z]{1,3}o//b.*")); //不匹配,没有边界
//whilte lines
p(" /n".matches("^[//s&&[^//n]]*//n$")); //空白行:空白且不换行,再出现0到多次,且换行结尾
p("aaa 8888c".matches(".*//d{4}."));
p("aaa 8888c".matches(".*//b//d{4}."));
p("aaa8888c".matches(".*//d{4}."));
p("aaa8888c".matches(".*//b//d{4}."));//不匹配,没有边界
5.Email地址匹配
p("]+@[//w[.-]]+//.[//w]asd_sf@dsdfsdf.com".matches("[//w[.-]]+@[//w[.-]]+//.[//w]+"));
6.查找匹配字串
Pattern p = Pattern.compile("//d{3,5}");
String s = "123-34345-234-00";
Matcher m = p.matcher(s);
p(m.matches()); //读到123-就判断不匹配,再find则从1234-后面的字符查找匹配
m.reset(); //再从头开始
p(m.find()); //条件匹配字串
p(m.lookingAt()) //每次从头开始找
7.start和end 起始位置和结束位置
前提是必须查找到子串
p(m.find());
p(m.start() + "-" + m.end()); 输出0-3
8.字符串的替换
Pattern.CASE_INSENSITIVE表示忽略大小写
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
while(m.find()) {
//p(m.replaseAll("JAVA")) 把全部有java的替换成大写
i++;
if(i%2 == 0) {//把单数的大写,双数的小写
m.appendReplacement(buf, "java");
} else {
m.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf); //添加尾巴字符串
p(buf);
9.分组
把正则表达式用()括起来就是分组
Pattern p = Pattern.compile("(//d{3,5})([a-z]{2})");
String s = "123aa-34345bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印所有
p(m.group(1)); //打印数字的
p(m.group(2)); //打印字母的
}
三.正则表达式的高级部分
1.quantifier数量词 有三种情况
Greedy 数量词
正常的正则表达式,从最大值开始
如{2,10},先从10开始,不匹配从后减少至匹配输出
Reluctant 数量词(懒惰)
表达式后加 ?
从最小值开始
如{2,10},先从2开始,不匹配从头开始增加至匹配输出
Possessive 数量词(独占)
表达式加 +
也是从最大值开始,不过不匹配不减少。直接退出
2.non-capturing groups (非捕获组)
加(?=X):即不捕获X
用法:放在前面算在其中,放在后天不算在其中
例:
Pattern p = Pattern.compile(".{3}(?=a)");
String s = "444a66b";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印输出444因为它不捕获a
}
3.向后引用
(组)//n 即前面找到组的第n个组,要和后面剩下的匹配
Pattern p = Pattern.compile("(//d(//d))//2");
String s = "122";
Matcher m = p.matcher(s);
p(m.matches()); //匹配,因为前面找到的第二个级是2和后面剩下的2匹配
4.flags的简写
?i :打开大小写忽略,相当于加入Pattern.CASE_INSENSITIVE
例:
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
p("Java".matches("(?i)(java)"));和上面实现的功能一样。
总结:这样应该算挺全的吧。。要是还有没写到的。也许就是我自己没学到的吧。。原谅一下。。哈。
原文出处 http://tb.blog.csdn.net/TrackBack.aspx?PostId=1575748
Matcher和Pattern
matches方法用来判断整个字符串有没有匹配
一.Pattern 匹配模式
[a-z]{3} []里是匹配的字符
{}里表示出现的个数
例子:
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("xyz");
System.out.println(m.matches());有没有符合条件
或者直接一句话写
System.out.println("fgh".matches("[a-z]{3}"));
不过效率没有上面的高。
二." . * + ?"特殊字符
. :点表示一个字符
* :星表示0个或多个
+ :加表示一个或多个
? :问号表示0个或一个
[] 表示一个范围内的值,只匹配其中一个
[^]:表示这个范围内的除外匹配
^ :不在[]里的,表示一行的开始
{n}:大括号表示出现的个数
{n,}最少出现n个最多无数个
{n,m}最少出现n个最多出现m个
"":空串表示0次
1.[] 表示一个范围内的值,只匹配其中一个
^:取非 即除此之外的内容
|:或者
&&:并且
例子:
p("a".matches("[abc]"));
p("a".matches("[^abc]")); //不匹配,表示abc除外
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z[A-Z]]"));
p("R".matches("[A-Z&&[RFG]]"));
2.认识/s /w /d /
/s 空白字符
/d 数字字符
/w 由[a-zA-Z_0-9]组成的字符 如:
以上的大写表达即为取非 如/D 非数字字符
例子:
p(" /n/r/t".matches("//s{4}")); //匹配 因为是4个空白字符
p(" ".matches("//S")); //不匹配S是非空白
p("a_8".matches("//w{3}"));
p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+"));
p("//".matches("////")); //正则表达式中用/开始,java也要加/,再与前面匹配
3.POSIX风格
p("a".matches("//p{Lower}")
4.边界 开头和结尾
^ :表示开头,不在[]里的表示一行的开始
$ :表示结尾
/b:表示单词边界,一般以空格为边界
p("hello sir".matches("^h.*")); //匹配 表示以h开头,字符有一个或者多个
p("hello sir".matches(".*ir$")); //匹配 表示字符是一个或多个且要以ir结尾
p("hello sir".matches("^h[a-z]{1,3}o//b.*")); //匹配 有单词边界
p("hellosir".matches("^h[a-z]{1,3}o//b.*")); //不匹配,没有边界
//whilte lines
p(" /n".matches("^[//s&&[^//n]]*//n$")); //空白行:空白且不换行,再出现0到多次,且换行结尾
p("aaa 8888c".matches(".*//d{4}."));
p("aaa 8888c".matches(".*//b//d{4}."));
p("aaa8888c".matches(".*//d{4}."));
p("aaa8888c".matches(".*//b//d{4}."));//不匹配,没有边界
5.Email地址匹配
p("]+@[//w[.-]]+//.[//w]asd_sf@dsdfsdf.com".matches("[//w[.-]]+@[//w[.-]]+//.[//w]+"));
6.查找匹配字串
Pattern p = Pattern.compile("//d{3,5}");
String s = "123-34345-234-00";
Matcher m = p.matcher(s);
p(m.matches()); //读到123-就判断不匹配,再find则从1234-后面的字符查找匹配
m.reset(); //再从头开始
p(m.find()); //条件匹配字串
p(m.lookingAt()) //每次从头开始找
7.start和end 起始位置和结束位置
前提是必须查找到子串
p(m.find());
p(m.start() + "-" + m.end()); 输出0-3
8.字符串的替换
Pattern.CASE_INSENSITIVE表示忽略大小写
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
while(m.find()) {
//p(m.replaseAll("JAVA")) 把全部有java的替换成大写
i++;
if(i%2 == 0) {//把单数的大写,双数的小写
m.appendReplacement(buf, "java");
} else {
m.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf); //添加尾巴字符串
p(buf);
9.分组
把正则表达式用()括起来就是分组
Pattern p = Pattern.compile("(//d{3,5})([a-z]{2})");
String s = "123aa-34345bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印所有
p(m.group(1)); //打印数字的
p(m.group(2)); //打印字母的
}
三.正则表达式的高级部分
1.quantifier数量词 有三种情况
Greedy 数量词
正常的正则表达式,从最大值开始
如{2,10},先从10开始,不匹配从后减少至匹配输出
Reluctant 数量词(懒惰)
表达式后加 ?
从最小值开始
如{2,10},先从2开始,不匹配从头开始增加至匹配输出
Possessive 数量词(独占)
表达式加 +
也是从最大值开始,不过不匹配不减少。直接退出
2.non-capturing groups (非捕获组)
加(?=X):即不捕获X
用法:放在前面算在其中,放在后天不算在其中
例:
Pattern p = Pattern.compile(".{3}(?=a)");
String s = "444a66b";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印输出444因为它不捕获a
}
3.向后引用
(组)//n 即前面找到组的第n个组,要和后面剩下的匹配
Pattern p = Pattern.compile("(//d(//d))//2");
String s = "122";
Matcher m = p.matcher(s);
p(m.matches()); //匹配,因为前面找到的第二个级是2和后面剩下的2匹配
4.flags的简写
?i :打开大小写忽略,相当于加入Pattern.CASE_INSENSITIVE
例:
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
p("Java".matches("(?i)(java)"));和上面实现的功能一样。
正则表达主要用的是java.util.regex 包中的主要两个类
Matcher和Pattern
matches方法用来判断整个字符串有没有匹配
一.Pattern 匹配模式
[a-z]{3} []里是匹配的字符
{}里表示出现的个数
例子:
Pattern p = Pattern.compile("[a-z]{3}");
Matcher m = p.matcher("xyz");
System.out.println(m.matches());有没有符合条件
或者直接一句话写
System.out.println("fgh".matches("[a-z]{3}"));
不过效率没有上面的高。
二." . * + ?"特殊字符
. :点表示一个字符
* :星表示0个或多个
+ :加表示一个或多个
? :问号表示0个或一个
[] 表示一个范围内的值,只匹配其中一个
[^]:表示这个范围内的除外匹配
^ :不在[]里的,表示一行的开始
{n}:大括号表示出现的个数
{n,}最少出现n个最多无数个
{n,m}最少出现n个最多出现m个
"":空串表示0次
1.[] 表示一个范围内的值,只匹配其中一个
^:取非 即除此之外的内容
|:或者
&&:并且
例子:
p("a".matches("[abc]"));
p("a".matches("[^abc]")); //不匹配,表示abc除外
p("A".matches("[a-zA-Z]"));
p("A".matches("[a-z]|[A-Z]"));
p("A".matches("[a-z[A-Z]]"));
p("R".matches("[A-Z&&[RFG]]"));
2.认识/s /w /d /
/s 空白字符
/d 数字字符
/w 由[a-zA-Z_0-9]组成的字符 如:
以上的大写表达即为取非 如/D 非数字字符
例子:
p(" /n/r/t".matches("//s{4}")); //匹配 因为是4个空白字符
p(" ".matches("//S")); //不匹配S是非空白
p("a_8".matches("//w{3}"));
p("abc888&^%".matches("[a-z]{1,3}//d+[&^#%]+"));
p("//".matches("////")); //正则表达式中用/开始,java也要加/,再与前面匹配
3.POSIX风格
p("a".matches("//p{Lower}")
4.边界 开头和结尾
^ :表示开头,不在[]里的表示一行的开始
$ :表示结尾
/b:表示单词边界,一般以空格为边界
p("hello sir".matches("^h.*")); //匹配 表示以h开头,字符有一个或者多个
p("hello sir".matches(".*ir$")); //匹配 表示字符是一个或多个且要以ir结尾
p("hello sir".matches("^h[a-z]{1,3}o//b.*")); //匹配 有单词边界
p("hellosir".matches("^h[a-z]{1,3}o//b.*")); //不匹配,没有边界
//whilte lines
p(" /n".matches("^[//s&&[^//n]]*//n$")); //空白行:空白且不换行,再出现0到多次,且换行结尾
p("aaa 8888c".matches(".*//d{4}."));
p("aaa 8888c".matches(".*//b//d{4}."));
p("aaa8888c".matches(".*//d{4}."));
p("aaa8888c".matches(".*//b//d{4}."));//不匹配,没有边界
5.Email地址匹配
p("]+@[//w[.-]]+//.[//w]asd_sf@dsdfsdf.com".matches("[//w[.-]]+@[//w[.-]]+//.[//w]+"));
6.查找匹配字串
Pattern p = Pattern.compile("//d{3,5}");
String s = "123-34345-234-00";
Matcher m = p.matcher(s);
p(m.matches()); //读到123-就判断不匹配,再find则从1234-后面的字符查找匹配
m.reset(); //再从头开始
p(m.find()); //条件匹配字串
p(m.lookingAt()) //每次从头开始找
7.start和end 起始位置和结束位置
前提是必须查找到子串
p(m.find());
p(m.start() + "-" + m.end()); 输出0-3
8.字符串的替换
Pattern.CASE_INSENSITIVE表示忽略大小写
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("java Java JAVa JaVa IloveJAVA you hateJava afasdfasdf");
while(m.find()) {
//p(m.replaseAll("JAVA")) 把全部有java的替换成大写
i++;
if(i%2 == 0) {//把单数的大写,双数的小写
m.appendReplacement(buf, "java");
} else {
m.appendReplacement(buf, "JAVA");
}
}
m.appendTail(buf); //添加尾巴字符串
p(buf);
9.分组
把正则表达式用()括起来就是分组
Pattern p = Pattern.compile("(//d{3,5})([a-z]{2})");
String s = "123aa-34345bb-234cc-00";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印所有
p(m.group(1)); //打印数字的
p(m.group(2)); //打印字母的
}
三.正则表达式的高级部分
1.quantifier数量词 有三种情况
Greedy 数量词
正常的正则表达式,从最大值开始
如{2,10},先从10开始,不匹配从后减少至匹配输出
Reluctant 数量词(懒惰)
表达式后加 ?
从最小值开始
如{2,10},先从2开始,不匹配从头开始增加至匹配输出
Possessive 数量词(独占)
表达式加 +
也是从最大值开始,不过不匹配不减少。直接退出
2.non-capturing groups (非捕获组)
加(?=X):即不捕获X
用法:放在前面算在其中,放在后天不算在其中
例:
Pattern p = Pattern.compile(".{3}(?=a)");
String s = "444a66b";
Matcher m = p.matcher(s);
while(m.find()) {
p(m.group()); //打印输出444因为它不捕获a
}
3.向后引用
(组)//n 即前面找到组的第n个组,要和后面剩下的匹配
Pattern p = Pattern.compile("(//d(//d))//2");
String s = "122";
Matcher m = p.matcher(s);
p(m.matches()); //匹配,因为前面找到的第二个级是2和后面剩下的2匹配
4.flags的简写
?i :打开大小写忽略,相当于加入Pattern.CASE_INSENSITIVE
例:
Pattern p = Pattern.compile("java", Pattern.CASE_INSENSITIVE);
p("Java".matches("(?i)(java)"));和上面实现的功能一样。
总结:这样应该算挺全的吧。。要是还有没写到的。也许就是我自己没学到的吧。。原谅一下。。哈。
原文出处 http://tb.blog.csdn.net/TrackBack.aspx?PostId=1575748
相关文章推荐
- JAVA正则表达式 Pattern和Matcher
- java中正则表达式的使用
- Java 正则表达式 Pattern & Matcher
- Java经典实例:正则表达式,替换匹配的文本
- Java正则表达式入门
- Java正则表达式
- Java-阶段小结笔记(三)--正则表达式
- java利用正则表达式截取网页数据
- java中解析HTML的方法:Jsoup和正则表达式
- java正则表达式
- Java利用正则表达式统计某个字符串出现的次数
- Java中的正则表达式
- Java基于正则表达式实现xml文件的解析功能详解
- 正则表达式 java.lang.StackOverflowError
- java中正则表达式使用
- 今天玩了一下JAVA的正则表达式
- Java正则表达式入门
- java中使用正则表达式:测试模式
- java 正则表达式隐藏手机号中间四位
- 技术-Java正则表达式语法与简单实例