用於對字符串進行操作。
好處:可以簡化對字符串的複雜操作
弊端:符號定義越多,正則越長,閱讀性越差
注意:在寫預定義字符類時 \和字母都是一個整體,因\本身是一個轉義字符,所以如\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,想要拿到符合需求的字符串的子串,用獲取。
心得:在操作字符串的時候,使用正則表達式來完成。很方便。