符合一定规则的表达式。
作用:用于专门操作字符串
特点:用一些特定的符号来表示一些代码操作。这样就简化了书写.
所以学习正则表达式,就是在学习一些特殊符号的使用。
好处:可以简化对字符串的复杂操作
弊端:符号定义越多,正则越长,阅读性越差
组:用小括号标示,每定义一个小括号,就是一个组,而且有自动编号,从1开始。
只要使用组,对应的数字就是使用该组的内容。别忘了,数组要加\\。
(aaa(wwww(ccc))(eee))技巧,从左括号开始数即可。有几个左括号就是几组。
注意:正则表达式中的反斜杠会一对对出现
--------------------------------------------------------------------------------------------------------------
具体操作功能:
1.匹配:String matches方法。用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false
2.切割:String split()
3.替换:String replaceAll()
4.获取:将字符串中的符合规则的子串取出
操作步骤:
1.将正则表达式封装成对象。
2.让正则对象和要操作的字符串相关联
3.关联后,获取正则匹配引擎
4.通过引擎对符合规则的子串进行操作,比如取出。
按照叠词完成切割:为了可以让规则的结果被重用
可以将规则封装成一个组。用()完成。租的出现都有编号。
从1开始。想要使用已有的组可以通过 \n(n就是组的编号)的形式来获取
例子:
(erkkrttczzzo)
regex("(.)\\1+") (.)代表第一个是任意字符 \\1 第二位判断是否拿第一个的结果,不匹配就往下走,继续。
要想获取组(.) 里的字符,用$1 可以将叠词的字符替换成单个字母 zzzz->z
---------------------------------------------------------------------------------------------------------------
常用规则:(查询String matches 正则表达式)
[abc]或[a-z] 只能匹配一个字符,并且只能是中括号里的某一个字符,第二个就继续写在后面
[abc] | a 、b 或 c (简单类) |
[^abc] | 任何字符,除了 a 、b 或 c (否定) |
[a-zA-Z] | a 到 z 或 A 到 Z ,两头的字母包括在内(范围) |
[a-d[m-p]] | a 到 d 或 m 到 p :[a-dm-p] (并集) |
[a-z&&[def]] | d 、e 或 f (交集) |
[a-z&&[^bc]] | a 到 z ,除了 b 和 c :[ad-z] (减去) |
[a-z&&[^m-p]] | a 到 z ,而非 m 到 p :[a-lq-z] (减去) |
-------------------------------------------------------------------------------------------------
匹配例子:
对QQ号码进行校验
要求:5-15 0不能开头,只能是数字
class Demo
{
public static void main(String[] args)
{
}
public static void checkQQ()
{
String qq="123467";
String regex="[1-9] [0-9] [4,14]"; //
凡是看到regex就知道定义了规则
boolean fag=qq.matches(regex); //
告知此字符串是否匹配给定的正则表达式
if(flag)
System.out.println(qq+"...OK");
else
System.out.println(qq+"...不匹配")
}
}
---------------------------------------------------------------------------------------------------------------
获取例子:
import java.util.regex.*
class RegexDemo
{
public static void main(String[] args)
{
}
public static void getDemo()
{
String str="ming tian fang jia ,dada";
String reg="\\b[a-z]{4}\\b"; // \\b单词边界
//将规则封装成对象
Pattern p=Pattern.compile(reg);
//让正则对象和要作用的字符串相关联,获取匹配器对象
Matcher m=p.matcher(str);
while(m.find()) //将规则作用到字符串上,并进行符合规则的子串查找
{
System.out.println(m.group()); //用于获取匹配后的结果
System.out.println(m.start()+"..."+m.end());//获取字符串的开头结尾角标
}
}
}
注意:
因为规则只定义了前4个和边界,那么匹配到tian的时候,不符合规则,matcher会返回flase
由于使用的是同一个匹配器,那么m.find()第二次的时候,直接从tian开始,
会出现不显示ming的情况
-------------------------------------------------------------------------------------------
正则表达式使用思路:
1.如果只想知道该字符是否对是错,使用匹配
2.想要将已有的字符串变成另一个字符串,替换
3.想要按照自定的字符串变成多个字符串,切割。获取规则以外的子串
4.想要拿到符合需求的字符串子串,获取。获取符合规则的子串
-----------------------------------------------------------------------------------------
网页爬虫(蜘蛛)
class Regex
{
public static void main(String[] args)
{
getMails();
}
//
获取网页地址
public static void getNet() throws Exception
{
Url=new URL("http://www.baidu.com");
URLConnection conn=url.openConnection();
BufferedReader bufIn=new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line=null;
String mailreg="\\w+@\\w+(\\.\\w+)+";
Pattern p=Pattern.complie(mailreg);
while((line=bufIn.readLine())!=null)
{
Matcher m=p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
/*
获取指定文档中的邮件地址
使用获取功能。Pattern Matcher
*/
public static void getMails() throws Exception
{
BuffereReader bufr=new BufferReader(new FileReader("mail.txt"));
String line=null;
String mailreg="\\w+@\\w+(\\.\\w+)+";
Pattern p=Pattern.complie(mailreg);
while((line=bufr.readLine())!=null)
{
Matcher m=p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}