目录
一、重复次数匹配
有以下字符串:
Huawei
Huaawei
Huaaawei
他们有什么规则呢? Hua{1,3}wei
其中,{1,3}表示前面的字符重复1到3次(1-3)
大括号的其他用法
{m,n} 最少m次,最多n次
{m,} 最少m次
{,n} 最多n次
{m} 刚好m次
参考代码
使用java.util.regex.*下的API来实现正则表达式
String content = "Huaawei";
String regex = "Hua{1,3}wei";
boolean isMatch = Pattern.matches(regex, content);
其中,regex为正则表达式(规则描述)
几个特殊的符号
* 表示0次、1次、或N次,相当于{0,}
+ 表示1次、或N次,相当于{1,}
? 表示0次、或1次,相当于{0,1}
例如,Hua+wei相当于Hua{1,}wei
举几个例子
Huawei | 与 | Hua*wei | 匹配 |
Huwei | 与 | Hua?wei | 匹配 |
Huaawei | 与 | Hua?wei | 不匹配 |
Huaawei | 与 | Hua{3}wei | 不匹配 |
二、字符区间匹配
有以下字符串:
穆宁雪
穆小雪
穆雪雪
用正则表达式来描述:穆[宁小雪]雪
其中,中括号[]表示区间内的任意一个字符
参考代码
public static void main(String[] args)
{
String content = "穆宁雪";
String regex = "穆[宁小雪]雪";
boolean isMatch = Pattern.matches(regex, content);
System.out.println("匹配: " + isMatch);
}
注意:正则表达式内不要加多余字符,包括空格
区间的其他写法
[a-xA-Z] 所有的字母
[0-9] 所有的数字
[0-9a-zA-Z_] 数字、字母、下划线
[^abc] 中括号内以^开头,表示“非”
中括号通常与大括号连用,例如:要求用户设定一个6-12位的密码。密码可以为数字、字母、下划线。
用正则表达式来描述就是[0-9a-zA-Z_]{6,12}
注意:正则的表达式的书写需要特别小心。别加多余的东西。而且一般需要多次尝试........................
三、分组
在正则表达式中,小括号表示一个分组:
例如:
ChinaGreat
ChinanaGreat
ChinananaGreat
用正则表达式可以表示为:Chi(na)+Great
参考代码
public static void main(String[] args)
{
String content = "ChinananaGreat";
String regex = "Chi(na)+Great";
boolean isMatch = Pattern.matches(regex, content);
System.out.println("匹配: " + isMatch);
}
四、字符的转义
考虑以下手机号的格式:
+86-13810012345
+86-13600120389
+86-13412338088
如何用正则表达式描述这样的规则呢?
参考代码
public static void main(String[] args)
{
String content = "+86-13810012345";
String regex = "+86-1[0-9]{10}";
boolean isMatch = Pattern.matches(regex, content);
System.out.println("匹配: " + isMatch);
}
可知,+在正则表达式中有特殊的含义:前面的{1,n}
在正则表达式中,如果想把特殊字符作为普通字符使用,则需要转义。
例如:\+86-1[0-9]{10} (\+转义后代表"+"号)
写成Java代码:"\\+ 86-1[0-9]{10}"
注意:此处有两个层次的转义:一层是Java对字符串的转义,另一层是正则表达式对特殊字符的转义(意思就是反斜杠本身也要转义)
public static void main(String[] args)
{
String content = "+86-13810012345";
String regex = "\\+86-1[0-9]{10}";
boolean isMatch = Pattern.matches(regex, content);
System.out.println("匹配: " + isMatch);
}
哪些字符需要转义?
* + ? {} [] () . ^ $ \ (\\)(\\\\)
更多注意事项
五、几种特殊用法
几个常见的预定的特殊字符
示例1:
1[0-9]{10} 和 1\d{10} 效果是一样的
示例2:
<meta charset="UTF-8">
正则描述为:<meta\s+charset=.*?> (\s代表一个空白字符,+代表至少一个, )
示例3:
jiusen@163.com
正则表达式 [\w@.]+
用Java表示:String regex = "[\\w@.]+ (从[]中的字符中,选取1-n个)
测试代码
public static void main(String[] args)
{
String content = "@jiusen.com";
String regex = "[\\w@.]+";
boolean isMatch = Pattern.matches(regex, content);
System.out.println("匹配: " + isMatch);
}
六、查找
代码
public static void main(String[] args)
{
String content = "更多图片<img src='1.jpg'><br>"
+ "示例2 <img src='2.jpg'><br>"
+ "示例3 <img src='3.jpg'><br>";
String regex = "<img .*>";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(content);
while(m.find())
{
System.out.println("**匹配: " + m.group(0)); //group(0)指全部
}
}
贪心模式
public static void main(String[] args)
{
String content = "更多图片<img src='1.jpg'><br>"
+ "示例2 <img src='2.jpg'><br>"
+ "示例3 <img src='3.jpg'><br>";
String regex = "<img .*?>";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(content);
while(m.find())
{
System.out.println("**匹配: " + m.group(0)); //group(0)指全部
}
}
正则表达式的编译
七、获取分组
public static void main(String[] args)
{
String content = "更多图片<img src='1.jpg'><br>"
+ "示例2 <img src='2.jpg'><br>"
+ "示例3 <img src='3.jpg'><br>";
String regex = "<img (.*?)>";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(content);
System.out.println("String regex = <img (.*?)>");
while(m.find())
{
int start = m.start();
String found = m.group(0);
String src = m.group(1);
System.out.println("group(0): " + found + "group(1): " + src); //group(0)指全部
}
}
public static void main(String[] args)
{
String content = "更多图片<img src='1.jpg'><br>"
+ "示例2 <img src='2.jpg'><br>"
+ "示例3 <img src='3.jpg'><br>";
String regex = "<img.*?src='(.*?)'\\s*>";
// String regex = "<img (.*?)>";
Pattern pattern = Pattern.compile(regex);
Matcher m = pattern.matcher(content);
System.out.println("<img.*?src=['\\\"](.*?)['\\\"]\\\\s*>" + " " + "<img.*?src='(.*?)'\\s*>");
while(m.find())
{
int start = m.start();
String found = m.group(0);
String src = m.group(1);
System.out.println("group(0): " + found + "group(1): " + src); //group(0)指全部
}
}