------- android培训、java培训、期待与您交流! ----------
正则表达式(regex)
正则表达式:符合一定规则的表达式。
作用:用于专门操作字符串。
好处:可以简化对字符串的复杂操作。
特点:用于一些特定的符号来表示一些代码操作。
学习正则表达式就是学习特殊符号的使用。
——某一位置必须是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(交集) |
. | ——任何字符(与行结束符可能匹配也可能不匹配) |
\d | ——数字:[0-9] |
例子:String reg=”[a-z]\\d”在字符串中单个\就把d转义了 | |
\D | ——非数字: [^0-9] |
\s | ——空白字符:[ \t\n\x0B\f\r] |
\S | ——非空白字符:[^\s] |
\w | ——单词字符:[a-zA-Z_0-9] |
\W | ——非单词字符:[^\w] |
X? | ——X,一次或一次也没有 |
例子:String reg=”[a-z]\\d?”;第一位a-z,第二位有可能数字有可能出现一次也有可能一次也没有 | |
X* | ——X,零次或多次符合这个规则的符号有可能出现0此也有可能多次 |
X+ | ——X,一次或多次 |
X{n} | ——X,恰好 n 次 |
X{n,} | ——X,至少 n 次 |
X{n,m} | ——X,至少 n 次,但是不超过 m 次 |
1、匹配:
方法:String类 boolean matches(String regex);
用规则匹配整个字符串,只要有一处不符合规则,就匹配结束,返回false
例:String qq=”12345”;
String reg=”[1-9]\\d{4,15}”;//第一位是1-9第二位是0-9至少四个像第二位这样的数,最多15位;
qq.matches(reg);
2、切割
String类 String[] split(String regex);根据给定的正则表达式的匹配拆分次字符串
例:String str=”zhangsan lisi wangwu”;
String reg=” +”;
String[]arr=str.split(reg);
特例:String str=”zhangsan.lisi.wangwu”;
String reg=\\.”;//因为\.是把.转义了,.代表任意字符。\\.才是以.未切割符切割。
String[]arr=str.split(reg);
特例2:String str=”c:\\abc\\a.txt”;
Stringreg=”\\\\”;转义两个\。
String[]arr=str.split(reg);
特例三:按照叠词完成切割。
可以把规则分成组 ——用()把分割符括起来。
组可以自动排序第一个()认为第一组,以此类推。
封装在同一个字符串中的组和组的调用可以用\1代表此位置遵循第一组规则\n代表遵循第n组规则。例(.)\1;表示两位第一位用.匹配,第二位也用第一组的规则匹配。
String str=”erkktyqqquizzzo”;
String reg=”(.)\\1+”;
String[] arr=str.split(reg);
总结:为了可以让规则的结果被重用可以将规则封装成一个组,用()完成。组的出现都有序号(从1开始)。想要使用已有的组可以通过\n(n就是组的编号)的形式获取。
例:((A)(B(C)));要看几组看左括号有几个
1 ((A)(B(C)))
2 \A
3 (B(C))
4 (C)
3、替换
方法:
replaceAll(String regex,String replacement) |
例:String str=”wei1289980000try122344qq”;
String reg=\\d{5,};
String newStr=”#”;
str=str.replaceAll(reg,newStr);
特例:将重叠的字符替换成单个字母。zzz—z;
(组的调用两种:封装在同一个字符串中用\n;不封装在同一个字符串中用$n(n代表组));
String str=”werkktyggguizzzz0o”;
String reg=”(.)\\1+”;
String reg=”$1”;
str=replaceAll(reg,newStr);
4、获取:将字符串符合规则的字串取出。
操作步骤:
1,将正则表达式封装成对象。
2,让正则对象和要操作的字符串相关联。
3,关联后,获取正则匹配引擎。
4,通过引擎对符合规则的子串进行操作,比如取出。
类Pattern(在java.util.regex包中)没有构造方法。
指定为字符串的正则表达式必须首先被编译为此类的实例。然后,可将得到的模式用于创建Matcher 对象,依照正则表达式,该对象可以与任意字符序列匹配。执行匹配所涉及的所有状态都驻留在匹配器中,所以多个匹配器可以共享同一模式。
因此,典型的调用顺序是
Pattern p = Pattern.compile("a*b");
Matcher m = p.matcher("aaaaab");
boolean b = m.matches();
在仅使用一次正则表达式时,可以方便地通过此类定义 matches方法。此方法编译表达式并在单个调用中将输入序列与其匹配。语句
boolean b = Pattern.matches("a*b","aaaaab");
等效于上面的三个语句,尽管对于重复的匹配而言它效率不高,因为它不允许重用已编译的模式。
方法:
static Pattern | |
matcher(CharSequence input) |
类Matcher:通过解释Pattern对charactersequence执行匹配操作的引擎
通过调用模式的 matcher方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。
方法:
group() |
单词边界:\b
例:
importjava.util.regex.*;
class RegexDemo2
{
public static voidmain(String[] args)
{
getDemo();
}
public static voidgetDemo()
{
String str ="ming tian jiu yao fang jia le ,da jia。";
System.out.println(str);
String reg ="\\b[a-z]{4}\\b";
//将规则封装成对象。
Pattern p =Pattern.compile(reg);
//让正则对象和要作用的字符串相关联。获取匹配器对象。
Matcher m = p.matcher(str);
//System.out.println(m.matches());//其实String类中的matches方法。用的就是Pattern和Matcher对象来完成的。
//只不过被String的方法封装后,用起来较为简单。但是功能却单一。
// boolean b =m.find();//将规则作用到字符串上,并进行符合规则的子串查找。
// System.out.println(b);
// System.out.println(m.group());//用于获取匹配后结果。
//System.out.println("matches:"+m.matches());
while(m.find())
{
System.out.println(m.group());
System.out.println(m.start()+"...."+m.end());
}
}
}
/*
网页爬虫(蜘蛛)
*/
import java.io.*;
import java.util.regex.*;
import java.net.*;
import java.util.*;
class RegexTest2
{
public static void main(String[] args) throws Exception
{
getMails_1();
}
public static void getMails_1()throws Exception
{
URL url = new URL("http://192.168.1.254:8080/myweb/mail.html");
URLConnection conn = url.openConnection();
BufferedReader bufIn = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String line = null;
String mailreg = "\\w+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(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
{
BufferedReader bufr =
new BufferedReader(new FileReader("mail.txt"));
String line = null;
String mailreg = "\\w+@\\w+(\\.\\w+)+";
Pattern p = Pattern.compile(mailreg);
while((line=bufr.readLine())!=null)
{
Matcher m = p.matcher(line);
while(m.find())
{
System.out.println(m.group());
}
}
}
}
------- android培训、java培训、期待与您交流! ----------详细请查看:http://edu.csdn.net