/*
* 正则表达式:用于操作字符串的一个规则
*
* 预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
字符类(范围词)
[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-dm-p]
[a-z&&[def]] d、e 或 f(交集)
单词边界匹配器
\b
*/
public class RegexDemo {
public static void main(String[] args) {
/*
* 匹配
*/
String source= ""; //匹配源数据
String reg = "1[34578]\\d{9}"; //验证手机号
String mail="[a-zA-Z1-9]\\w{5,17}@[a-zA-Z0-9]{2,}(\\.(com|cn|net))){1,2}";//邮箱
String reg1 = "0\\d{2,3}-[0-9]\\d{6,7}";//验证固话
System.out.println(source.matches(reg1)?"验证通过":"验证失败");
/*
* 切割
*/
String source2 = "正 则 表 达式";
String reg2 =" +";//取出空格
String[] datas = source2.split(reg2);
System.out.println(Arrays.toString(datas));
String source3 = "我正正正则表达式式";//重叠词
String reg3 = "(.)\\1+"; // ()代表分组,\1代表第一组的内容
String[] datas3 = source3.split(reg3);
System.out.println(Arrays.toString(datas3));
/*
* 替换
*/
String source4 = "手机号是:13444555555";
String reg4 = "1[34578]\\d{9}";
source4 = source4.replaceAll(reg4, "***********");
System.out.println("替换后:"+source4);
String source5 = "正正正则则表达达式";
String reg5 = "(.)\\1+";
source5 = source5.replaceAll("(.)\\1+", "$1");//$符号表示引用的第一组内容
System.out.println("替换后:"+source5);
/*
* 查找
* 需要正则对象,
* Pattern p = Pattern.compile("a*b"); (正则对象)
* Matcher m = p.matcher("aaaaab"); (匹配器对象)
* boolean b = m.matches();
*/
//找出三个字母组成的单词
String source6 = "zheng ze biao da shi shi he he he wos ddd";
String reg6 = "\\b[a-zA-Z]{3}\\b"; // \b是单词边界匹配器
Pattern p = Pattern.compile(reg6);
Matcher m = p.matcher(source6);
while(m.find()){//类似迭代的hasnext
System.out.println(m.group());//类似迭代的next
}
}
}
* 正则表达式:用于操作字符串的一个规则
*
* 预定义字符类
. 任何字符(与行结束符可能匹配也可能不匹配)
\d 数字:[0-9]
\D 非数字: [^0-9]
\s 空白字符:[ \t\n\x0B\f\r]
\S 非空白字符:[^\s]
\w 单词字符:[a-zA-Z_0-9]
\W 非单词字符:[^\w]
Greedy 数量词
X? X,一次或一次也没有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好 n 次
X{n,} X,至少 n 次
X{n,m} X,至少 n 次,但是不超过 m 次
字符类(范围词)
[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-dm-p]
[a-z&&[def]] d、e 或 f(交集)
单词边界匹配器
\b
*/
public class RegexDemo {
public static void main(String[] args) {
/*
* 匹配
*/
String source= ""; //匹配源数据
String reg = "1[34578]\\d{9}"; //验证手机号
String mail="[a-zA-Z1-9]\\w{5,17}@[a-zA-Z0-9]{2,}(\\.(com|cn|net))){1,2}";//邮箱
String reg1 = "0\\d{2,3}-[0-9]\\d{6,7}";//验证固话
System.out.println(source.matches(reg1)?"验证通过":"验证失败");
/*
* 切割
*/
String source2 = "正 则 表 达式";
String reg2 =" +";//取出空格
String[] datas = source2.split(reg2);
System.out.println(Arrays.toString(datas));
String source3 = "我正正正则表达式式";//重叠词
String reg3 = "(.)\\1+"; // ()代表分组,\1代表第一组的内容
String[] datas3 = source3.split(reg3);
System.out.println(Arrays.toString(datas3));
/*
* 替换
*/
String source4 = "手机号是:13444555555";
String reg4 = "1[34578]\\d{9}";
source4 = source4.replaceAll(reg4, "***********");
System.out.println("替换后:"+source4);
String source5 = "正正正则则表达达式";
String reg5 = "(.)\\1+";
source5 = source5.replaceAll("(.)\\1+", "$1");//$符号表示引用的第一组内容
System.out.println("替换后:"+source5);
/*
* 查找
* 需要正则对象,
* Pattern p = Pattern.compile("a*b"); (正则对象)
* Matcher m = p.matcher("aaaaab"); (匹配器对象)
* boolean b = m.matches();
*/
//找出三个字母组成的单词
String source6 = "zheng ze biao da shi shi he he he wos ddd";
String reg6 = "\\b[a-zA-Z]{3}\\b"; // \b是单词边界匹配器
Pattern p = Pattern.compile(reg6);
Matcher m = p.matcher(source6);
while(m.find()){//类似迭代的hasnext
System.out.println(m.group());//类似迭代的next
}
}
}