简单的正则表达式:匹配最后一个点之前的所有内容

18
只想匹配最后一个句点之前的每个字符,但不包括句点本身。
 dog.jpg     -> dog
 abc123.jpg.jpg -> abc123.jpg

我已经尝试过

(.+?)\.[^\.]+$

1
你有问题吗?Stack Overflow不是为了帮你写正则表达式而存在的。 - jonrsharpe
对于像abcda.b.c.d.e这样的情况,有什么用途呢? - rock321987
你想要的是移除文件扩展名吗?为什么不使用工具来代替正则表达式呢?比如basename()函数。 - aampudia
不需要使用任何工具,只是为了学习过程,无论是哪种编程语言都可以。 - bigdowg
使用我的OutSystems平台进行测试。 - bigdowg
3个回答

41

使用先行断言来确认最后一个点字符:

.*(?=\.)

现场演示。


这里不需要向前看,它只会增加步骤数。 - rock321987
2
这将始终在相同位置匹配两次。 - user557597

14

这样就行了

(.*)\.

正则表达式演示

第一个捕获组包含名称。你可以根据你所用的语言使用$1\1来访问它。


这对我来说包括点。 - bigdowg
1
@bigdowg 你在哪里使用它?它只是显示匹配的部分... 在演示中的绿色部分显示了你想要的实际字符串。 - rock321987

12

默认情况下,正则表达式是贪婪的。这意味着当正则表达式模式可以匹配更多字符时,它将匹配更多字符。

对于您来说,这是一件好事。您只需要匹配字符,然后再匹配一个点:

.*\.

也就是说,

.   # Match "any" character
*   # Do the previous thing (.) zero OR MORE times (any number of times)
\   # Escape the next character - treat it as a plain old character
.   # Escaped, just means "a dot".

所以:默认情况下贪婪地匹配尽可能多的字符(因为它是贪婪的),然后匹配一个字面点号。


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