java通过正则表达式提取字符串中的某一段字符串

本文介绍了如何在Java中使用正则表达式提取字符串中的特定部分。通过实例展示了两种方法,一种是直接提取,另一种是通过替换不需要的部分为空白字符串。在示例场景中,提取文件名用于阿里云OSS的图片管理,文件名由日期、UUID和后缀名组成。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

​ 我们在编写程序中免不了要涉及到通过正则表达式找到该字符串中有用的一部分。

​ 那么既然可以通过正则表达式找到这一段字符串,可不可以再将这一段字符串给提取出来呢?答案是可以的。

​ 我们需要怎么去提取所匹配当前正则表达式的字符串呢?

​ 我们可以去使用jdk自带的工具类完成此操作,当然我们得模拟一个使用的场景来完成此次测试。

  • 使用场景:使用阿里云的oss将图片上传之后,我们需要从oss中删除该图片,就必须得用到图片名称,因此需要将图片名称提取出来。
  • 这里我的图片存储是按照当天的年月日作为文件夹,使用uuid去除-,再加上之前的文件后缀名作为文件名来存储文件的

第一种方法:直接提取

/**
 * 从图片url中获取文件名称
 * @param url 文件存储路径
 * @return 返回文件名称
 */
public static String getFileNameFromUrl(String url){
    // 编写正则表达式
    String regFileName = "([0-9]+\\/)+([a-zA-Z0-9]+)\\.(jpg|png|jpeg)";
    // 匹配当前正则表达式
    Matcher matcher = Pattern.compile(regFileName).matcher(url);
    // 定义当前文件的文件名称
    String fileName = "";
    // 判断是否可以找到匹配正则表达式的字符
    if (matcher.find()) {
        // 将匹配当前正则表达式的字符串即文件名称进行赋值
        fileName = matcher.group();
    }
    // 返回
    return fileName;
}

第二种方法:将不用的部分替换为空字符串

/**
 * 从图片url中获取文件名称
 * @param url 文件存储路径
 * @return 返回文件名称
 */
public static String getFileNameFromUrl(String url){
    return url.replaceAll("^(http|https)\\:\\/\\/([a-zA-Z\\-]+\\.)+(com|cn)\\/", "")
        .replaceAll("\\?([a-zA-Z]+\\=[a-zA-Z0-9\\.]+\\&)+([a-zA-Z]+\\=[a-zA-Z0-9\\%]+)$", "");
}
  • url一般的格式:https://wenzea.oss-cn-beijing.aliyuncs.com/2022/02/12/b0d3d337eea9485e82d84c5f16fabc9f.jpg?Expires=3599658873&OSSAccessKeyId=TMP.3KeAjOmPlD3MRVM6a5Qb9NwZTMvTgDiHt6PjZy6cVjJnK5HHHDLP4O9BDzgUBdYgTCyyjFFPOWNJ6gfln6zEBvabi416j&Signature=BhMCetPDgxdXpPFG3fxpsowg3SNzQ3D
  • 而提取出来的文件名称是:2022/02/12/b0d3d337eea9485e82d84c5f16fabc9f.jpg
    在这里插入图片描述
    可以看到,在测试方法中已经成功的将文件名称提取出来了。
### 如何使用Java正则表达式匹配并提取字符串中的指定字符 在Java中,可以通过`Pattern`类和`Matcher`类实现基于正则表达式字符串匹配与提取功能。以下是具体方法: #### 使用 `Pattern` 和 `Matcher` 进行匹配 通过定义一个正则表达式模式,并将其编译为 `Pattern` 对象,随后创建对应的 `Matcher` 实例来进行匹配操作。 ```java import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { public static void main(String[] args) { String input = "abc123def456ghi"; String regex = "\\d+"; // 定义正则表达式以匹配连续的数字 Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { // 查找所有符合条件的部分 System.out.println("找到的子串:" + matcher.group()); } } } ``` 上述代码展示了如何从给定字符串 `"abc123def456ghi"` 中提取所有的数字序列[^3]。这里的关键在于正则表达式 `\d+` 的含义——`\d` 表示单个数字字符,而加号 `+` 则表示匹配前面的内容一次或多次。 #### 提取字符串中间值 如果目标是从复杂字符串提取位于两个固定边界之间的内容,则可以利用懒惰量词 `[\s\S]*?` 来完成这一任务[^4]。例如,在如下场景下: 假设有一个字符串 `"start-value-end"` 并希望获取其中 `-value-` 部分的具体数据,可采用以下方式实现: ```java String input = "start-value-end"; String regex = "-(.*?)-"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); if (matcher.find()) { System.out.println(matcher.group(1)); // 输出 value } ``` 此例子说明了当需要捕获被其他符号包裹的目标片段时,应该如何构建相应的正则表达式以及处理逻辑。 #### 特殊情况下的日期提取 对于更复杂的案例比如提取日期信息,可以根据实际需求定制化设计正则表达式。下面的例子演示了怎样从未加工过的文本中抽取出标准格式的日期项[^5]: ```java String input = "x20xxx/day=2022-06-12xxx19852x"; String regex = "(\\d{4}-\\d{2}-\\d{2})"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println("提取到的日期:" + matcher.group(1)); } ``` 这段程序能够成功识别出形如 `YYYY-MM-DD` 的日期结构,并打印出来作为结果展示。 --- #### 总结 以上介绍了几种常见的应用场景及其解决方案,涵盖了基本的数值提取、嵌套字段解析以及特定格式的时间戳检索等方面的知识点。每种情形都需要依据实际情况调整所使用的正则表达式模板,从而达到精准定位的目的。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值