public static void main(String[] args) {
String pattern = "020-\\d{8}";
System.out.println("请输入一个广州的电话号码");
Scanner sc = new Scanner(System.in);
while (sc.hasNextLine()){
String line = sc.nextLine();
if (line.matches(pattern)){
System.out.println("请火速汇款30万元以立即购买,否则失去发财机会!!");
System.out.println("请再次输入");
}else {
System.out.println("输入的电话号码无效");
System.out.println("请再次输入");
}
}
}
public static void main(String[] args) {
String p = "\\.";
String str = "fkit.org";
String[] res1 = str.split(p);//以.作为分隔符
String[] res2 = str.split(".");//以任意字符作为分隔符,正则表达式中,"."匹配任何字符
System.out.println(res2.length==0);// true,因为是以任意字符为分隔符,所以根本分解不了!!
System.out.println("以.作为分隔符");
for(var i:res1){
System.out.println(i);
}
System.out.println("以任意字符作为分隔符,因此res2是null,正则表达式中,\".\"匹配任何字符");
for (var i:res2){
System.out.println(i);
}
}
Java对正则表达式的支持
String 类:
matches(regex):判断该字符串是否匹配正则表达式
split(regex):根据指定分隔符将字符串分割成多段
replaceAll(regex,replacement):将regex匹配的内容替换replacement
public static void main(String[] args) {
String s = "我爱Java,我爱凤姐,我爱编程";
String r = s.replaceAll("[a-zA-Z]+", "钱");
System.out.println(r);
}
public static void main(String[] args) {
System.out.println("abc".matches("(abc){1,2}"));
System.out.println("abcc".matches("(abc){1,2}"));
System.out.println("abcabc".matches("(abc){1,2}"));
}
{m,n} 前面的字符出现m~n次
{m,}前面的字符出现m~∞次
{,n}前面的字符出现0~n次
{n}前面的字符出现n次
^开头
$结尾
. 代表任意一个字符
\d 代表任意一个数字 digit
\D 代表任意一个非数字
\w 代表任意一个单词
\W 代表任意一个非单词
\s 代表任意一个空白
\S 代表任意一个非空白
[a-d] 范围:代表a、b、c、d任一字符
[adm] 枚举,代表a、d、m其中任一字符
[am4-6] 混合:代表a、m、4、5、6任一字符
[^a-d] 求否,代表不是a、b、c、d其中任一字符
[a-g&&[^c-e]]:求与,表示a、b、f、g其中任一一个字符
? :前面的字符可以出现0~1次
例如:a?b 可以代表b,ab
*:前面的字符出现0~N次
例如
1⃣️ a*b可以代表b,ab,aaab,aaaab
2⃣️ \d * 5可以代表5,345,345345
3⃣️[0-1]*5可以代表5,00005,01101015
+:前面的字符出现1~N次
a+b:可以代表ab,aaab,aaaaaaaab
\d+5可以代表345,345345
[0-1]+5可以代表000005,01101015
成组:
(abc){1,2}可以代表:abc,abcabc
((abc)|(123))* : 可以代表"" , abc123
((abc) * | (123)*):可以代表"" , abcabc , 123123
用于实现从文本中提取有效的信息,比如手机号码,提取之后随意使用
Pattern就代表了正则表达式
String s = "1(([35][0-9])|(47)|(9[0-35-9]))\\d{8}";//电话号码
Pattern p = Pattern.compile(s);//编译一个正则表达式
Matcher m = p.matcher(line);//假设line是一个io流中一行一行读取的String的java对象
// Matcher的创建对象这一行就代表了从line中提取出p正则表达式匹配的字符串!!!
2021年11月4日更~~~~~~~~~~~~~~~~~~~~~~~~~~~
在这个代码中,因为有2对(),所以分成了2组,并且第一对()对应第一组group(1),第二组()对应第二组group(2),而group对应的是匹配的整个字符串。
样 例 1 样例1 样例1
public static void main(String[] args) {
String cnt = "kasldjklas s7789 nn1189asdk";
String regstr = "(\\d\\d)(\\d\\d)";
Matcher m = Pattern.compile(regstr).matcher(cnt);
while (m.find()){
System.out.println("Res = " + m.group(0));
System.out.println("Group 1 is " + m.group(1));
System.out.println("Group 2 is " + m.group(2));
}
}
每次匹配4个数字,
第一次匹配的整个字符串是7789,7789里面有2组,第一组是77,第二组是89
第二次匹配的整个字符串是1189,1189里面有2组,第一组是11,第二组是89
运 行 结 果 运行结果 运行结果
样 例 2 样例2 样例2
跟上面的一样,分组多了一个,可以跟样例1一起搭配理解
public static void main(String[] args) {
String cnt = "hanshunping s7789 nn1189han";
String regstr = "(\\d\\d)(\\d)(\\d)";
Matcher m = Pattern.compile(regstr).matcher(cnt);
while (m.find()){
System.out.println("Res = " + m.group(0));
System.out.println("Group 1 is " + m.group(1));
System.out.println("Group 2 is " + m.group(2));
System.out.println("Group 3 is " + m.group(3));
}
}
P S PS PS:通过分组的序号和通过命名来查找分组本质上是一样的,都是先找到匹配的整个字符串,再通过()分组,来把匹配的字符串分成一小组,一小组,只不过一种是给小组排了序号,另外一种是直接就给分组起了名字.
public static void main(String[] args) {
String sql = "kasldjklas s7789 nn1189asdk";
Matcher m = Pattern.compile("(?\\d\\d)(?\\d\\d)" ).matcher(sql);
while (m.find()){
System.out.println("找到的匹配的整个字符串 = "+m.group());
System.out.println("第一个分组的内容 = " + m.group(1));
System.out.println("第二个分组的内容 = " + m.group(2));
System.out.println("通过组名,第一个分组的内容" + m.group("g1"));
System.out.println("通过组名,第二个分组的内容" + m.group("g2"));
System.out.println("-----------------------\n\n");
}
}
传送门:group笔记参考的页面
传送门:韩顺平精解正则表达式