在最后一个下划线之前查找字符

时间:2009-06-17 15:20:16

标签: regex

有没有人知道如何在文件名中的最后一个下划线之前找到所有字符。

IABU_Real_Egypt_AUS09_012.indd

我需要的结果是IABU_Real_Egypt_AUS09

提前致谢

4 个答案:

答案 0 :(得分:7)

/(.*)_/并获取捕获的值。正则表达式通常是贪婪的,所以它是自动的(你不需要负面的字符类)。

irb(main):007:0> "IABU_Real_Egypt_AUS09_012.indd".match(/(.*)_/)[1]

=> "IABU_Real_Egypt_AUS09"

答案 1 :(得分:2)

怎么样:

(.*?)_[^_]*

然后你想要的结果是在第1组中。(你没有指定一种语言,所以这就是我可以去的。)

有多种方法可以做到这一点;我相信你可以使用前瞻或后仰。我所做的是:

  1. 匹配尽可能多的字符(但非贪婪)。将它们保存在一个组中。
  2. 匹配下划线。
  3. 匹配任意数量的字符,只要它们不是下划线。
  4. 这将涉及一些回溯,所以如果这是一个性能关键的代码片段,你可能需要比我更好地优化它。

    更好的解决方案是从字符串的末尾开始并向后计数直到达到下划线,然后将子字符串从0转到该索引。这可能比使用正则表达式更快更清晰。例如,在Java中:

    public static String getUpToUnderscore(String str) {
        return str.substring(0, str.lastIndexOf('_'));
    }
    

答案 2 :(得分:1)

C#中的非正则表达式示例:

s.Substring(0, s.LastIndexOf('_'))

答案 3 :(得分:0)

假设你有至少1个下划线,你可以这样做:

/(.*_[^_]+)/