正则表达式:删除某个字符之前的所有文本

43

有没有一种简单的方法可以删除"_"前面的所有字符?例如,将3.04_somename.jpg更改为somename.jpg

学习编写正则表达式的建议也很好。 我查看的大多数地方都难以理解。


在哪种语言中?你会看到几种不同的正则表达式。 - Russ Clarke
1
这是一个经典的http://www.regular-expressions.info/tutorial.html。 - xanatos
首先,这并不难。其次,您需要指出问题所处的情况。 - Ya Zhuang
@RussC:在这种情况下,语言并不是很重要,因为这种正则表达式非常基本(不需要任何那些新潮的非正则表达式扩展),它可以在几乎任何正则表达式引擎中工作,甚至包括 POSIX BREs。当然,OP仍然需要知道如何将正则表达式应用于他的字符串,所以你当然是正确的。 - Tim Pietzcker
8个回答

97
^[^_]*_

将匹配第一个下划线之前的所有文本。用空字符串替换它。

例如,在C#中:

resultString = Regex.Replace(subjectString, 
    @"^   # Match start of string
    [^_]* # Match 0 or more characters except underscore
    _     # Match the underscore", "", RegexOptions.IgnorePatternWhitespace);

学习正则表达式,请查看http://www.regular-expressions.info


有没有办法用JavaScript实现这个功能? - Lukasz
1
正则表达式完全相同;我链接的网站包含了有关如何在JavaScript中进行正则表达式替换的所有信息。 - Tim Pietzcker
@Lukasz - 在 JavaScript 中,您可以这样做: var result = '3.04_somename.jpg'.replace(/^[^_]*_/, ''); - romiem
我该如何扩展这个正则表达式,一直到最后一个“_”出现? - nikjohn
3
你需要使用不同的正则表达式,而不是扩展当前的正则表达式。类似于“^.*_”这样的方式会是最简单的方法。 - Tim Pietzcker

7

正则表达式:

^[^_]*_(.*)$

然后获取括号内的部分。 在Perl中:

my var = "3.04_somename.jpg";
$var =~ m/^[^_]*_(.*)$/;
my fileName = $1;

在Java中:

String var = "3.04_somename.jpg";
String fileName = "";
Pattern pattern = Pattern.compile("^[^_]*_(.*)$");
Matcher matcher = pattern.matcher(var);
if (matcher.matches()) {
    fileName = matcher.group(1);
}

...


4

不需要进行替换。正则表达式可以直接给你想要的结果:

"(?<=_)[^_]*\.jpg"

使用grep进行测试:

 echo "3.04_somename.jpg"|grep -oP "(?<=_)[^_]*\.jpg"
somename.jpg

正是我正在寻找的,谢谢!我会尝试这些建议。我正在使用Perl正则表达式。 - greenage

3

这是Tim的一个变体,仅适用于某些正则表达式实现:^.*?_

var subjectString = "3.04_somename.jpg";
var resultString = Regex.Replace(subjectString,
    @"^   # Match start of string
    .*?   # Lazily match any character, trying to stop when the next condition becomes true
    _     # Match the underscore", "", RegexOptions.IgnorePatternWhitespace);

2
在Javascript中,我会使用/.*_/,意思是:匹配到下划线(包括下划线)之前的所有内容。
例如:
console.log( 'hello_world'.replace(/.*_/,'') ) // 'world'

1

0
如果您将您的URL转换为[System.Uri],则localPath字段会给您想要的内容:
$link_url = "https://www.subdomain.domain.com/files
$local_path= [System.Uri]::new($link_url)

将会返回 $local_path = /files


0

我从这个网站http://www.zytrax.com/tech/web/regex.htm学习了所有的正则表达式。 在谷歌上搜索“正则表达式教程”,你会找到很多有用的文章。

String regex = "[a-zA-Z]*\.jpg";
System.out.println ("somthing.jpg".matches (regex));

返回 true。


你需要转义点 :) - Tim Pietzcker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接