JAVA 正则表达式

需要掌握:正则表达式

java中的 \\

在 Java 中,使用 正则表达式 的 特殊符号 时,前面需要用 \\ 转义。
相当于 \t 表示制表符

在其他语言中,一般使用 \ 表示

需要转义的符号有:

.
*
+
$
\/
?
^
[
]
(
)
{
}

JAVA 与 正则表达式

JAVA 处理正则表达式的类都在java.util.regex 包

Pattern 类

Pattern 类没有公共构造方法。要创建 Pattern 对象,通过调用下面静态方法:

public static Pattern compile(String regex)
public static Pattern compile(String regex, int flags)

返回 Pattern 对象。该方法第一个参数是 正则表达式

Matcher 类

Matcher 对象是对输入字符串进行解释和匹配操作的引擎。Matcher 也没有公共构造方法,通过调用下面静态方法 要创建 Matcher 对象:

public Matcher matcher(CharSequence input)
传入要匹配的字符串,返回 Matcher 对象。

Matcher 类的常用方法

  • matches():判断整个字符串是否完全匹配正则表达式

  • find():查找字符串中是否存在匹配的子串(可多次调用,每次找下一个)

  • group():获取匹配到的子串(配合 find() 使用),group(n) 可获取第 n 个分组的内容

  • replaceAll(String replacement):替换所有匹配的子串

  • replaceFirst(String replacement):替换第一个匹配的子串

Matcher 类的 matches()方法

判断整个字符串是否完全匹配正则表达式

例子

//编译正则表达式
Pattern p = Pattern.compile("\\d+");
//传入要匹配的字符串,返回 Matcher 对象
Matcher m = p.matcher("123");
//进行匹配
boolean b=m.matches();
System.out.println(b);

Pattern 简化

Pattern 类有下面静态方法,简化操作:
public static boolean matches(String regex, CharSequence input)
该方法源代码如下:

Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
return m.matches();

例子:

boolean b=Pattern.matches("\\d+","123");
System.out.println(b);

String 简化

String类有下面方法,简化匹配操作
public boolean matches(String regex)
该方法源代码如下:

return Pattern.matches(regex, this);

例子:

boolean b="123".matches("\\d");
System.out.println(b);

Matcher 类的 find() 方法

查找字符串中是否存在匹配的子串(可多次调用,每次找下一个)

例子

String text = "2002年asdf2005年2389423,2019年";
String patternStr = "\\d\\d\\d\\d年";
Matcher matcher = Pattern.compile(patternStr).matcher(text);

int count = 0;
while (matcher.find()) {
    count++;
}
System.out.println("年份出现次数:"+count);

执行结果:

年份出现次数:3

Matcher 类的 group() 方法

提取匹配正则表达式的子串(配合 find() 使用)

String text = "2002年asdf2005年2389423,2019年";
String patternStr = "\\d\\d\\d\\d年";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(text);

// 必须执行find(),否则报错
while (matcher.find()) {
    System.out.println(matcher.group());
}

执行结果:

2002年
2005年
2019年

Matcher 类的 group(n) 方法

可获取第 n 个分组的内容

String text = "2002年01月20日asdf2005年02月10日2389423,2019年10月25日";
// 正则表达式中,一个 () 就是一组
String patternStr = "(\\d\\d\\d\\d年)(\\d\\d月)(\\d\\d日)";
Pattern pattern = Pattern.compile(patternStr);
Matcher matcher = pattern.matcher(text);

while (matcher.find()) {
    System.out.println(matcher.group(0)); // 0表示提取整个匹配字符串
    System.out.println(matcher.group(1)); // 1表示提取第1组,即:\\d\\d\\d\\d年
    System.out.println(matcher.group(2)); // 2表示提取第2组,即:\\d\\d月
    System.out.println(matcher.group(3)); // 3表示提取第3组,即:\\d\\d日
}

例子

验证手机号

移动号段正则表达式

String regex="^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$";
boolean flag = "13811111111".matches(regex);//判断功能
System.out.println(flag);

正则表示式意思:

  • ^:表示以后面这些数字为开始
  • ((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8])):有小括号,这些是一组,相当于数学中的小括号,表示优先级。
    • [4-9]:表示4-9之间的数字都符合
    • |:表示 或者
      表示前3位:134、135、136、137、138、139、147、150、151、152,157、158、159、178、182、183、184、187、188
  • \\d{8}:表示8个任意数字
  • |(1705)\\d{7}:表示或者1705号段,后面是7个任意数字
  • $:表示匹配字符串结尾

替换字符串

//将下面字符串中,数字替换成【JAVA】
String str="wp3ofe1hwpeojf5哦I啊6我哦";
String str2=str.replaceAll("\\d","【JAVA】");
System.out.println(str);
System.out.println(str2);

感谢:
https://www.runoob.com/java/java-regular-expressions.html


原文出处:/show_1EF4tkPXc2dh.html