Pattern pattern = Pattern.compile("[^0-9]"); Matcher matcher = pattern.matcher(phoneString); //将与模式匹配的输入序列的每个子序列替换为给定的替换字符串。 String all = matcher.replaceAll(""); //System.out.println("phone:" + all); // 2 String abc = Pattern.compile("[^0-9]").matcher(phoneString).replaceAll("");
时间: 2024-04-09 08:32:19 浏览: 16
这段代码使用正则表达式来过滤掉`phoneString`中的非数字字符,并将结果存储在字符串`all`和`abc`中。
正则表达式`[^0-9]`表示匹配除了数字0到9之外的任何字符。`Pattern.compile("[^0-9]")`编译了这个正则表达式,并创建了一个`Pattern`对象。
然后,`matcher()`方法根据创建的`Pattern`对象创建了一个`Matcher`对象,该对象用于在`phoneString`中进行匹配操作。
`matcher.replaceAll("")`将与正则表达式匹配的输入序列的每个子序列替换为空字符串,即删除非数字字符,得到结果保存在`all`和`abc`中。
你可以将结果打印出来进行验证,例如使用`System.out.println("phone:" + all);`来打印结果。
相关问题
private static final String EMAIL_REGEX = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$"; //手机号验证正则表达式 private static final String PHONE_REGEX = "^1[3-9]\\d{9}$"; @Override public User loginService(LoginParams loginParams) { //查询条件 QueryWrapper<User> queryWrapper = new QueryWrapper<>(); Matcher emailMatcher = Pattern.compile(EMAIL_REGEX).matcher(loginParams.getUserAccount()); Matcher phoneMatcher = Pattern.compile(PHONE_REGEX).matcher(loginParams.getUserAccount()); //格式匹配邮箱 if (emailMatcher.matches()) { queryWrapper.eq("user_email",loginParams.getUserAccount()) .eq("user_password",MD5Utils.inputPassToFormPass(loginParams.getUserPassword())); } //格式匹配手机号 else if (phoneMatcher.matches()) { queryWrapper.eq("user_phone",loginParams.getUserAccount()) .eq("user_password",MD5Utils.inputPassToFormPass(loginParams.getUserPassword())); } //均不匹配则验证用户名 else { queryWrapper.eq("user_account",loginParams.getUserAccount()) .eq("user_password",MD5Utils.inputPassToFormPass(loginParams.getUserPassword())); } return userMapper.selectOne(queryWrapper); }
您的代码看起来非常简洁和易于阅读。这里有一些可以提高代码可读性和性能的建议:
1. 将正则表达式的编译移到类的静态初始化块中,以避免在每次方法调用时重新编译正则表达式。
2. 使用常量代替魔法数字或字符串,以提高代码的可维护性。
3. 在查询用户时,可以使用 Lambda 表达式来简化查询条件。
下面是优化后的代码:
```java
private static final String EMAIL_REGEX = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$";
private static final String PHONE_REGEX = "^1[3-9]\\d{9}$";
// 编译正则表达式
private static final Pattern EMAIL_PATTERN = Pattern.compile(EMAIL_REGEX);
private static final Pattern PHONE_PATTERN = Pattern.compile(PHONE_REGEX);
@Override
public User loginService(LoginParams loginParams) {
// 查询条件
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 格式匹配邮箱
Matcher emailMatcher = EMAIL_PATTERN.matcher(loginParams.getUserAccount());
if (emailMatcher.matches()) {
queryWrapper.lambda().eq(User::getUserEmail, loginParams.getUserAccount())
.eq(User::getUserPassword, MD5Utils.inputPassToFormPass(loginParams.getUserPassword()));
}
// 格式匹配手机号
else if (PHONE_PATTERN.matcher(loginParams.getUserAccount()).matches()) {
queryWrapper.lambda().eq(User::getUserPhone, loginParams.getUserAccount())
.eq(User::getUserPassword, MD5Utils.inputPassToFormPass(loginParams.getUserPassword()));
}
// 均不匹配则验证用户名
else {
queryWrapper.lambda().eq(User::getUserAccount, loginParams.getUserAccount())
.eq(User::getUserPassword, MD5Utils.inputPassToFormPass(loginParams.getUserPassword()));
}
return userMapper.selectOne(queryWrapper);
}
```
希望这些建议能够帮助到您!
public static boolean isPhoneNumber(String number) { String regex = "^1[3-9]\\d{9}$"; // 手机号正则表达式 return number.matches(regex);}优化这段代码
这段代码本身已经很简洁和高效了,不过还是有一些可以优化的地方。以下是一些可能的优化建议:
1. 可以将正则表达式字符串作为类常量,避免每次调用 `isPhoneNumber` 方法都重新编译正则表达式。
2. 可以使用 `Pattern` 类的 `compile` 方法将正则表达式编译成 `Pattern` 对象,再使用 `Matcher` 类的 `matches` 方法匹配手机号码,这样可以避免每次调用 `matches` 方法都重新编译正则表达式。
3. 如果需要高并发处理多个手机号码,可以使用多线程或线程池来处理,提高效率。不过需要注意线程安全问题。
下面是一个可能的优化实现:
```java
public class PhoneNumberUtils {
private static final Pattern PHONE_PATTERN = Pattern.compile("^1[3-9]\\d{9}$");
public static boolean isPhoneNumber(String number) {
return PHONE_PATTERN.matcher(number).matches();
}
}
```
这样实现可以避免每次调用 `isPhoneNumber` 方法都重新编译正则表达式,提高效率。同时,使用 `Pattern` 和 `Matcher` 类也可以更加灵活地处理正则表达式匹配。