正则表达式中级应用(java语言版)
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.有多少个匹配
小问题:如果我们需要匹配[email protected]的邮箱,我们用以前的知识就会写出\\[email protected]\\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[]= {"[email protected]","[email protected]","[email protected]"};
String regex = "(\\[email protected]\\w+\\.com)";
Pattern pattern = Pattern.compile(regex);
for (String xString:string)
{
Matcher p = pattern.matcher(xString);
if(p.find()) {
System.out.println(xString);
}
}
}
}
结果:
[email protected]
[email protected]
[email protected]
提示:+是一个元字符,如果需要匹配+自身就需要转义符\\+
以上就有一个问题我们[email protected]也是符合要求的,但是我们上面的正则却找不到他,于是我们就需要以下的式子
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[]= {"[email protected]","[email protected]","[email protected]","[email protected]"};
String regex = "([\\s|(\\w+\\.)]\\[email protected]\\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);
}
}
}
}
结果:
[email protected]
[email protected]
[email protected]
[email protected]
+ |
一次或多个 |
* |
零次或多个 |
? |
表示此正则可以出现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”也给匹配进去了,而加了?的懒惰型元字符没有,我们写程序的时候需要按照实际需求编写代码。