1. 对特殊字符进行转义
元字符是在一些在正则表达式里有特殊含义的字符。英文句号”.”是一个元字符,它也可以匹配任何一个单个字符,类似的”[”,”]”也是元字符。
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= "[\"a b.c\"]";
String regex = "(\\[\\\"a\tb\\.c\\\"\\])";
Pattern pattern = Pattern.compile(regex);
Matcher p = pattern.matcher(string);
if(p.find()) {
System.out.println(string);
}
}
}
结果:
["a b.c"]
小知识:[\"a b.c\"]本质就是”a\tb.c”,我们在写他的正则时候一定要注意转义符的使用\\[\\\"a\tb\\.c\\\"\\。
[\b] | 回退(并删除)一个字符(backsapce) |
\f | 换页符 |
\n | 换行符 |
\r | 回车符 |
\t | 制表符(tab) |
\v | 垂直制表符 |
\d | 任何一个数字字符[0-9] |
\D | 任何一个非数字字符[^0-9] |
\w | 任何一个[0-9a-zA-Z]字符 |
\W | 任何一个[^0-9a-zA-Z]字符 |
\s | 任何一个空白字符[\f\n\r\t\v] |
\S | 任何一个非空字符[^\f\n\r\t\v] |
\x | 十六进制(\x0a--->10) |
\0 | 八进制(\011--->9) |
小知识:如果我们要匹配array[10]该怎么匹配呢?我们可以使用array\\[\\d\\d\\]完成如果是100呢?我们将会下面进行解释。
2.使用posix字符类
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= "<BODY BGOLOR=\"336633\" TEXT=\"#ffffff\"";
String regex = "([p{Digit}[2]])";
Pattern pattern = Pattern.compile(regex);
Matcher p = pattern.matcher(string);
if(p.find()) {
System.out.println(string);
}
}
}结果:
<BODY BGOLOR="336633" TEXT="#ffffff"
3.有多少个匹配
小问题:如果我们需要匹配text@text.text的邮箱,我们用以前的知识就会写出\\w@\\w\.\\w,但是问题就来了我们不知道各个部分的长度,这似乎不写的很合理。
3.1匹配一个或多个字符
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[]= {"ben@163.com","support@qq.com","abc@yahoo.com"};
String regex = "(\\w+@\\w+\\.com)";
Pattern pattern = Pattern.compile(regex);
for (String xString:string)
{
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
ben@163.com
support@qq.com
abc@yahoo.com
提示:+是一个元字符,如果需要匹配+自身就需要转义符\\+
以上就有一个问题我们a.ben@163.com也是符合要求的,但是我们上面的正则却找不到他,于是我们就需要以下的式子
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[]= {"a.ben@163.com","ben@163.com","support@qq.com","abc@yahoo.com"};
String regex = "([\\s|(\\w+\\.)]\\w+@\\w+\\.com)";
//String regex = "([\\w.]@\\w+\\.com)";
Pattern pattern = Pattern.compile(regex);
for (String xString:string)
{
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
a.ben@163.com
ben@163.com
support@qq.com
abc@yahoo.com
+ | 一次或多个 |
* | 零次或多个 |
? | 表示此正则可以出现0次/1次 |
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[]= {"http://www.abc.com","https://www.abc.com","httpss://www.abc.com","httpsss://www.abc.com"};
String regex = "(http://[\\w./]+)";
Pattern pattern = Pattern.compile(regex);
for (String xString:string)
{
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
http://www.abc.com
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[]= {"http://www.abc.com","https://www.abc.com","httpss://www.abc.com","httpsss://www.abc.com"};
String regex = "(http://[\\w./]+)";
Pattern pattern = Pattern.compile(regex);
for (String xString:string)
{
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
http://www.abc.com
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[]= {"http://www.abc.com","https://www.abc.com","httpss://www.abc.com","httpsss://www.abc.com"};
String regex = "(https+://[\\w./]*)";
Pattern pattern = Pattern.compile(regex);
for (String xString:string)
{
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
https://www.abc.com
httpss://www.abc.com
httpsss://www.abc.com
知识点:在windows是使用\r\n作为文本行的结束标签。而linux、unix只是\n。所以我们可以尝试这样写正则:[\\r]?\n。
{n} | 正则正好出现n次 |
{n,m} | 正则正好出现n~m次 |
{n,} | 正则至少出现n次 |
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= "<BODY BGOLOR=\"336633\" TEXT=\"#ffffff\"";
String regex = "([p{Digit}[2]])";
Pattern pattern = Pattern.compile(regex);
Matcher p = pattern.matcher(string);
if(p.find()) {
System.out.println(string);
}
}
}结果:
<BODY BGOLOR="336633" TEXT="#ffffff"
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[]= {"1001:$2134.43","1002:$2122.2523","1003:$55.2145","1001:$46664.321"};
String regex = "(\\d+:\\$\\d{2,}\\d{2,})";
Pattern pattern = Pattern.compile(regex);
for (String xString:string)
{
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
1001:$2134.43
1002:$2122.2523
1001:$46664.321
贪婪型元字符 | 懒惰型元字符 |
* | *? |
+ | +? |
{n,} | {n,}? |
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= "sdak<B>Ak</B>and<B>HI</B>sdas";
String regex = "((<[bB]>.*</[Bb]>))";
String result[] = string.split(regex);
for (String string2 :result) {
System.out.println(string2);
}
}
}
结果:
sdak
sdas
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= "sdak<B>Ak</B>and<B>HI</B>sdas";
String regex = "((<[bB]>.*?</[Bb]>))";
String result[] = string.split(regex);
for (String string2 :result) {
System.out.println(string2);
}
}
}
结果:
sdak
and
sdas
通过上面两个程序我们知道利用贪婪型元字符将”and”也给匹配进去了,而加了?的懒惰型元字符没有,我们写程序的时候需要按照实际需求编写代码。