【问题标题】:Regex to find a given number of characters after last underscore正则表达式在最后一个下划线之后查找给定数量的字符
【发布时间】:2019-12-22 15:12:57
【问题描述】:

我需要在给定文件名的最后一个下划线后找到两个字符。

示例字符串:

sample_filename_AB12123321.pdf

我正在使用[^_]*(?=\.pdf),但它会找到下划线之后的所有字符,例如AB12123321

我只需要找到前两个字符AB

而且,没有办法访问代码,只能修改正则表达式模式。

【问题讨论】:

  • .replaceFirst(".*_(.{2}).*", "$1")?或者使用.*_(.{2}) / _([^_]{2})[^_]*$ 模式匹配并抓取matcher.group(1)
  • 另外,为什么不使用lastIndexOf?见ideone.com/m2tjmt
  • 我无法更改 java 代码。我需要修复正则表达式以找到指定的字符

标签: java regex schema.yml


【解决方案1】:

如果您想使用正则表达式解决问题,您可以使用:

 (?<=_)[^_]{2}(?=[^_]*$)

regex demo

详情

  • (?&lt;=_) - 下划线必须立即出现在当前位置的左侧
  • [^_]{2} - 捕获组 1:除下划线以外的任意 2 个字符
  • (?=[^_]*$) - 紧靠当前位置的左侧,必须出现除下划线和字符串结尾之外的任何 0+ 字符。

Java demo

String s = "sample_filename_AB12123321.pdf";
Pattern pattern = Pattern.compile("(?<=_)[^_]{2}(?=[^_]*$)");
Matcher matcher = pattern.matcher(s);
if (matcher.find()){
    System.out.println(matcher.group(0)); 
} 

输出:AB

【讨论】:

  • 对不起,我应该只更改正则表达式。由于 java 代码已修复,我无法更改它以获取 matcher.group(1)
  • @Vicky 那么,您的意思是您需要一个通过matcher.group(0) 获取值的匹配 模式吗?我修改了答案以适应该要求。
猜你喜欢
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-14
  • 2021-12-30
  • 2021-07-29
  • 1970-01-01
相关资源
最近更新 更多