Java面试题汇总之正则表达式

一、正则表达式(Regular Expression)

正则表达式就是一个验证字符串格式是否满足要求的字符串。 使用一个字符串匹配一组字符串,这个字符串就是正则表达式(模式)

 (1)字符类:

元符集解释
a 字符a
[abc] 匹配abc
[^abc]任何字符,除了 ab c(否定)
[a-zA-Z]a z A Z,两头的字母包括在内(范围)
[a-d[m-p]]a d m p[a-dm-p](并集)
[a-z&&[def]] de f(交集)
[a-z&&[ ^bc]] a z,除了 b c[ad-z](减去)
[a-z&&[ ^m-p]]a z,而非 m p[a-lq-z](减去)

 (2)预定义字符类:

预定义字符类解释
.任意字符(与行结束符可能匹配也可能不匹配)
\d数字:[0-9]
\w单词字符[a-zA-Z_0-9]
^行开头
$行结尾
X?一次或0次
X*0次或多次(包括1次)
X+一次或多次
X{n}恰好n次
X{n,}至少n次
X{n,m}至少n次,不超过m次

(3)匹配电话号码:

//匹配电话号码
String phone = "18637866964";
String reg = "^1[3,5,7,8,9]\\d{9}$";
System.out.println(phone.matches(reg));

原理:

String 中的matches()方法,用来进行正则表达式的验证,匹配返回 true,否则返回 false。

String中的源码:

    public boolean matches(String regex) {
        return Pattern.matches(regex, this);
    }

在String 的matches()方法中使用了 Pattern 的静态方法 matches()方法进行正则表达式的验证。Pattern的matches()方法的源码:

public static boolean matches(String regex, CharSequence input) {
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    return m.matches();
}

从源码中可以看出:正则表达式的一般使用步骤:

  1. 正则表达式首先首先被编译为 Pattern (模式)对象;
  2. 根据 Pattern 对象的 matcher() 方法创建 Matcher(匹配器)对象,该方法以待验证的输入字符为参数;
  3. 使用Matcher对象的matches()方法进行正则表达式验证,并返回结果;

如果正则表达式只使用一次,也可以写成如下形式:

boolean b = Matcher.matches(reg,input);

(4)正则表达式的其他应用:

正则表达式除了可以进行字符串的匹配验证,还可以进行拆分字符串、获取字符串的子串、字符串替换:

1)拆分字符串:

String test_1 = "my name  is   suxing";
//根据空格拆分字符串,“ +”:匹配一个或多个空格。
String [] words = test_1.split(" +");
for(String s:words){
    System.out.println(s);
}
//根据空格或逗号拆分字符串,“[ ,]”:匹配一个空格或一个逗号
String test_2 = "my name is zhangsan,wlecome to beijing";
String [] words_1 = test_2.split("[ ,]");
for(String s:words_1){
    System.out.println(s);
}

2)获取子串:

//获取字符串中的java、Java、JAVA
String test_1 = "java 是世界上最好的语言,Java天下第一,我爱JAVA";
String reg = "[jJ]ava|JAVA";
Pattern pattern = Pattern.compile(reg);
Matcher matcher = pattern.matcher(test_1);

while (matcher.find()){
    System.out.println(matcher.group());
}

使用 Matcher 对象的find() 方法查询是否存在满足正则表达式的字符串,如果有,使用group() 方法输出。

3)替换:

//把字符串中的java、Java、JAVA全部替换成PHP
String test_1 = "java 是世界上最好的语言,Java天下第一,我爱JAVA";
String reg = "[jJ]ava|JAVA";
String test_2 = test_1.replaceAll(reg,"PHP");
System.out.println(test_2);

4)统计字符串出现的次数:

package com.qianfeng.kaoti01;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Test02 {
    public static void main(String[] args) {
        int num = 0;
        String str= "I wish you become better and better";
        String reg = "[e]";
        Pattern pattern = Pattern.compile(reg);
        Matcher matcher = pattern.matcher(str);

        while (matcher.find()){
            num++;
        }
        System.out.println("共"+num+"个e");
    }
}

(5)练习题:

1、利用正则表达式,把 “我...我我...喜欢欢欢...编编程程程...” ,转换成 “我喜欢编程” ;

String test_1 = "我...我我...喜欢欢欢...编编程程程...";
String test_2 = test_1.replace(".","");
String test_3 = test_2.replaceAll("(.)\\1+","$1");
System.out.println(test_3);

"\\1"表示引用前面的一组表达式即 "(.)”,"$1" 表示 "\\1" ;

2、利用正则表达式,把 “我..喜欢喜欢...编程编程编程...” ,转换成 “我喜欢编程” ;

String test_1 = "我..喜欢喜欢...编程编程编程...";
String test_2 = test_1.replace(".","");
String test_3 = test_2.replaceAll("(.)(.)(\\1\\2)+","$1$2");
System.out.println(test_3);
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值