正则表达式是现代编程的一个极为重要的技能之一,在开发的过程中我们经常需要进行字符串的筛选,截取等操作。接下来我会将《正则表达式必知必会》里的知识点使用java语言描述。
1. Java正则基本知识点
正则标记 1.单个字符(数量1) 字符:表示由一个字符组成 \\:表示转义符号'\' \t:表示一个'\t'符号 \n:匹配换行(\n)符号 2.一组字符(数量1) [abc]:表示可能是字符a/b/c任意一位 [^abc]:表示不是"abc"中的任意一位 [a-z]:表示所有的小写字母 [a-zA-Z]:表示任意的一位字母,不区分大小写 [0-9]:表示任意一位数字 3.简化字符集表示(数量1) ".":表示任意的一位字符 \d:等价于"[0-9]"属于简化写法(\\d) \D:等价于"[^0-9]" \s:表示任意的空白字符,例如:"\t","\n" \S:表示非空字符 \w:等价于"[a-zA-Z_0-9]"表示由任意的字母,数字下划线组成 \W:非\w 4.边界匹配(一般在js使用) ^:正则的开始 $:正则的结束 5.数量表达 ?:表示此正则可以出现0次/1次 +:表示此正则可以出现1次/1次以上 *:表示此正则可以出现0/1/1次以上 {n}:表示此正则正好出现n次 {n,}:表示此正则正好出现n次以上 {n,m}:表示此正则正好出现n~m次 6.逻辑运算: 正则1正则2:正则1判断完成之后继续判断正则2 正则1 | 正则2:正则1/正则2满足一个就可 (正则):将多个正则作为一组,可以为这一组担负设置出现的次数 |
2. 匹配纯文本
package 正则;
//匹配单个字符串
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string = "hello.my name is Ben.please....";
String regex = "Ben";
Pattern pattern = Pattern.compile(regex);
Matcher p = pattern.matcher(string);
System.out.println(p.find());
}
}
结果:true
package 正则;
//匹配多个字符串
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string = "hello.my name is Ben.please....";
String regex = "((Ben)|(my))";
Pattern pattern = Pattern.compile(regex);
Matcher p = pattern.matcher(string);
System.out.println(p.find());
}
}
结果:true
知识扩展:正则表达式是区分大小写的,所以Ben不匹配ben。
3.匹配任意字符串
知识扩展:如果你在Dos的文件搜索功能,你将发现正则表达式里面的(java语言)”.”字符相当于dos里面的”?”字符,SQL用户将发现正则表达式里的”.”相当于”_”字符。
package 正则;
//匹配ab*c字符
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string[] = {"sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
String regex = "(sale.)";
Pattern pattern = Pattern.compile(regex);
for(String xString :string) {
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
sales1.xls
sale3.xls
sale2.xls
知识扩展:”.”字符可以匹配任何单个的字符、字母、数字甚至是”.”字符本身,所以如下代码成立。
package 正则;
//匹配ab*c字符
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string[] = {"sale.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
//多加了一个sale.xls请注意
String regex = "(sale.)";
Pattern pattern = Pattern.compile(regex);
for(String xString :string) {
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
sale.xls
sales1.xls
sale3.xls
sale2.xls
知识扩展:在同一个正则表达式内我们允许使用多个”.”字符,他们既可以连续出现(一个接着一个——..将匹配任意两个字符),也可以间隔出现在模式的不同位置。
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string[] = {"sale.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
String regex = "(.a.)";
Pattern pattern = Pattern.compile(regex);
for(String xString :string) {
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
sale.xls
sales1.xls
sale3.xls
sale2.xls
apac1.xls
na1.xls
sa1.xls
小问题:我们需要匹配.a.模式的文件话那该怎么写呢?我们知道就算就写.a..也只是匹配.a后面两个任意字符而不是单独匹配我们的.这个单个字符。
所以在这里我们需要使用转义符”\”进行转义。
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string[] = {"sale.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
String regex = "(.a.\\.xls)";
Pattern pattern = Pattern.compile(regex);
for(String xString :string) {
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
na1.xls
sa1.xls
4.匹配一组字符
再接着上面的例子如果我们还是仍然想找出na/sa,我们应该怎么办?如果我们使用.a\\.也会出现ca.xls。
所以我们将会使用员字符[和]来定义一个字符集合。
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string[] = {"sale.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
String regex = "((n|s)a.\\.xls)";
Pattern pattern = Pattern.compile(regex);
for(String xString :string) {
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
na1.xls
sa1.xls
字符集合中不需要区分字母大小写(或者是只须匹配某个特定部分)的搜索操作里比较常见。比如匹配以下字符数组:
"RegEx","regex","regEx","Regex","segex"
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string[]= {"RegEx","regex","regEx","Regex","segex"};
String regex = "([Rr]eg[Ee]x)";
for (String xString :string) {
Pattern pattern = Pattern.compile(regex);
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
RegEx
regex
regEx
Regex
5.利用字符集合区间
小问题:如果我们需要筛选出[ns]a.\.xls文件筛选出nsm.xls怎么排除它?
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string[]= {"asm.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
String regex = "([ns]a\\d\\.xls)";
for (String xString :string) {
Pattern pattern = Pattern.compile(regex);
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
na1.xls
sa1.xls
小知识:[a-zA-Z0-9]这个字符集所简写的形式是:{a-z,A-Z,0-9}
而java内的\S则是非空字符,需要注意的是前者是后者的子集。
6.取非匹配
由于某些场合我们需要匹配一个字符的取反情况。我们可以使用元字符^来表达相对一个字符集进行非空匹配。
package 正则;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
//匹配*a* 类似文本
public class Exp001 {
public static void main(String[] args) {
// TODO Auto-generated method stub
String string[]= {"nas.xls","sales1.xls","order3.xls","sale3.xls","sale2.xls","apac1.xls","na1.xls","sa1.xls"};
String regex = "([ns]a[^0-9]\\.xls)";
for (String xString :string) {
Pattern pattern = Pattern.compile(regex);
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:nas.xls