用于对字符串进行操作。
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性越差
注意:在写预定义字符类时 \和字母都是一个整体,因\本身是一个转义字符,所以如\d 要写成 \\d
常用功能:
1,匹配 matches(String regex)。
匹配过程中只要有一个不符全规则,就结束,返回false
例:
要求:一串数字 1,长度为5-10 2,0不能开头 3,帐号只能是数字
public void method(String qq)
{
String regex = "[1-9][0-9]{4,9}";
/*
意思:第一位数在1-9之间,第二位数在0-9之间,第二位可以有4-9个数字。
{}表示数量,看java.util.regex或 matches(String regex)
*/
boolean flag = qq.matches(regex);
if(flag)
System.out.println("qq "+qq);
else
System.out.println("帐号不对");
}
要求:匹配电话号码:开头只能是 13*******;或15******;或18*******;
String regex = "1[358][0-9]{9}";
或写成String regex = "1[358]\\d{9}";
//解说:第一位必须是1,第二位只能是3,5,8,第三位开始只能是9位且满足0-9
网页爬虫(蜘蛛)
--> 把满足邮箱格式的邮箱给取出来
public void getMails_2() throws Exception
{
URL url = new URL("http://www.baidu.com");
URLConnection uc = url.openConnection(); //获取连接
BufferedReader bufr =
new BufferedReader(new InputStreamReader(uc.getInputStream()));
String mailregex = "[a-zA-Z0-9_]+@[a-zA-Z0-9]+(\\.[a-zA-Z]+)+";
Pattern p = Pattern.compile(mailregex);
String line = null;
while ((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line);
while (m.find()) //按规则,满足返回true,并指向下一位
{
System.out.println(m.group());
}
}
}
2,切割 split(String regex)
以一定规则把字符串进行切割。返回字符数组。
例:
String[] arr = str.split(regex);
regex = " +" ; 以一个或多个空格切割
"\\."; 以 . 切割,注意:在正则中.表示任意,所以要加\\转义
"\\\\" 以 \\ 切割
以叠词切割 --> "(.)\\1" 以(.)\1 切割 因为放在字符串中,转义所以要写成(.)\\1
(.)是任意的意思\1是一组的意思
3,替换 replaceAll(String regex, String replacement)
例:
将字符串中数字连续>=5个的变成一个#
replaceAll(str,"\\d{5,}","#");
将叠词 替换成 *
replaceAll(str,"(.)\\1+","*");
注意:用()表示分组的意思,$1 表示保留这个分组
如:我我要要要学学学学 变成:我要学
replaceAll(“(.)\\1”,”$1”);
$1表示:替换成()这个组里面的。
例:将 112.46.33.3 IP地址每段补两个0 如 : 00112.0046.0033.003
replaceAll("([0-9]+)","00$1");
使其都保留成3位
replaceAll("0*([0-9]{3})","$1");
心得:还可以使用替换功能来去掉字符串中不想要的字符
如:我。。。。要学 变成:我要学
str.replaceAll(“\\.”,””);
4,获取 compile 将字符串中的符合规则的子串取出。
操作步骤:
1,将正则表达式封装成对象
Pattern p = Pattern.compile(regex);
2,让正则对象和要操作的字符串相关联
Matcher m = p.matcher(str);
3,关联后,获取正则匹配引擎
boolean b = m.find(); //将规则作用到字符串上,并进行符合规则的子串查找,有就返回true.
4,通过引擎对符合规则的子串进行操作,比如取出
m.group();
例:
找出字符串中单词长度为3的单词
String str = "ming tian jiu yao fang jia le ,da jiao-shi";
String regex = "\\b[a-z]{3}\\b"; \b是单词边界
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);
while (m.find()) //如果满足规则,就返回true,并往指向下一个子串
{
System.out.println(m.group());
System.out.println("--------"+m.start()+"....."+m.end());//取出单词前后的角下标
}
如何选取所须要的方法?
1,如果只是想知道字符是否对错,用匹配。
2,想要将已有字符变成另一个字符串,用替换。
3,想要按照自定的方式将字符串变成多个子字符串,用切割。
4,想要拿到符合需求的字符串的子串,用获取。
心得:在操作字符串的时候,使用正则表达式来完成。很方便。