1.正则表达式语法
1.正则表达式:符合一定规则的字符串
**
将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,”n”匹配字符”n”。”\n”匹配换行符。序列”\”匹配”\”,”(“匹配”(“。
^
匹配输入字符串开始的位置。如果设置了 RegExp 对象的 Multiline 属性,^ 还会与”\n”或”\r”之后的位置匹配。
$
匹配输入字符串结尾的位置。如果设置了 RegExp 对象的 Multiline 属性,$ 还会与”\n”或”\r”之前的位置匹配。
*
零次或多次匹配前面的字符或子表达式。例如,zo* 匹配”z”和”zoo”。* 等效于 {0,}。
+
一次或多次匹配前面的字符或子表达式。例如,”zo+”与”zo”和”zoo”匹配,但与”z”不匹配。+ 等效于 {1,}。
?
零次或一次匹配前面的字符或子表达式。例如,”do(es)?”匹配”do”或”does”中的”do”。? 等效于 {0,1}。
{n}
n 是非负整数。正好匹配 n 次。例如,”o{2}”与”Bob”中的”o”不匹配,但与”food”中的两个”o”匹配。
{n,}
n 是非负整数。至少匹配 n 次。例如,”o{2,}”不匹配”Bob”中的”o”,而匹配”foooood”中的所有 o。”o{1,}”等效于”o+”。”o{0,}”等效于”o*”。
{n,m}
M 和 n 是非负整数,其中 n <= m。匹配至少 n 次,至多 m 次。例如,”o{1,3}”匹配”fooooood”中的头三个 o。’o{0,1}’ 等效于 ‘o?’。注意:您不能将空格插入逗号和数字之间。
?
当此字符紧随任何其他限定符(*、+、?、{n}、{n,}、{n,m})之后时,匹配模式是”非贪心的”。”非贪心的”模式匹配搜索到的、尽可能短的字符串,而默认的”贪心的”模式匹配搜索到的、尽可能长的字符串。例如,在字符串”oooo”中,”o+?”只匹配单个”o”,而”o+”匹配所有”o”。
.
匹配除”\r\n”之外的任何单个字符。若要匹配包括”\r\n”在内的任意字符,请使用诸如”[\s\S]”之类的模式。
x|y
匹配 x 或 y。例如,’z|food’ 匹配”z”或”food”。’(z|f)ood’ 匹配”zood”或”food”。
2.Pattern类
(1) 8种模式:比如启用多行模式,启用unix模式等,eg int CASE_INSENSITIVE表示启用不区分大小写的模式。
(2) 4个静态方法
两个单例模式构造器:
Pattern compile(String regex);
Pattern compile(String regex,int flags)flags为八种模式的一种
eg2:
Pattern p=Pattern.compile(“[a-z]\s[a-z]”);
Matcher m=p.matcher(“b c”);
if(m.matches()) Sysout(1111);
else Sysout(2222); 输出结果为1111;
一个匹配方法,一个返回String的字面值模式方法:
boolean matches(String regex,CharSequence input);//input与regex匹
配返回true。
String quote(String s);//返回指定String的字面值。
eg3:boolean bool=Pattern.matches(“[a-z] [a-z]”,”bc”); //结果为true
Sysout(Pattern.quote(“a_#/tb”));//输出结果为 “\Qa_# b”\E
(3) 6个普通方法
返回此模式的匹配器: Matcher matcher(CharSequence input);
返回此模式的标志: int flags();
返回此模式的regex: String pattern();
两个字符串切割方法: String[] split(CharSequence input);
String[] split(CharSequence input,intlimit);
limit为返回字符串的个数,如果等于0,返回所有拆分的字符串,如果大于拆分字符串的实际个数,返回实际个数。
toString方法: String toString();
3.示例
1.例如:案例:键盘录入qq号码,校验QQ号码。
需求:
1:要求必须是5-15位数字
2:0不能开头
import java.util.Scanner;
/**
* 案例: 键盘录入qq号码,校验QQ号码。
* 需求: 1:要求必须是5-15位数字
* 2:0不能开头
*/
public class RegexDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 键盘录入qq号码
System.out.println("请输入您的qq号码");
// 获取录入数据
String qq = sc.nextLine();
//创建方法,里面使用正则表达式实现
System.out.println(isCheck2(qq));
}
private static boolean isCheck2(String qq) {
//定义正则表达式
String reg = "[1-9][0-9]{4,14}";
return qq.matches(reg);
}
}
2.校验电话号码
public class RegexDemo {
public static void main(String[] args) {
// 校验电话号码
/*
* 13245678901 13332345678 13456789012 18812345678 18999999999
* 18666666666 18786868686
*/
//定义正则表达式
String reg = "1[38][0-9]{9}";
//System.out.println("键盘输入电话号码");
String number = "13245678901";
System.out.println(number.matches(reg));
}
}
3.切割字符串
import java.util.Arrays;
/*
* 我有如下一个字符串:”91 27 46 38 50”
请写代码实现最终输出结果是:”27 38 46 50 91”
*/
public class SplitExercise {
public static void main(String[] args) {
String str = "91 27 46 38 50";
//设定正则表达式
String reg = " ";
//运用split方法切割
String[] strs = str.split(reg);
//将String数组转换为int数组并排序
int[] arr = new int[strs.length];
for (int i = 0; i < arr.length; i++) {
arr[i] = Integer.parseInt(strs[i]);
}
//排序
Arrays.sort(arr);
//将int[]转换为StringBuffer
StringBuffer sb = new StringBuffer();
for (int i = 0; i < arr.length; i++) {
sb.append(arr[i]+" ");
}
//将StringBuffer转换为String
System.out.println(sb.toString());
}
}