正则表达式最后一次出现的位置是什么?

189

我想捕获最后一个反斜杠之后的部分。
我需要 \Web_ERP_Assistant(带有 \)。

我的想法是:

C:\Projects\Ensure_Solution\Assistance\App_WebReferences\Web_ERP_WebService\Web_ERP_Assistant


\\.+?(?!\\)      //  I know there is something with negative look -ahead `(?!\\)`

但我找不到它。

[Regexer演示]


4
感谢您的提问涉及到正则表达式,但您确定这是在这种情况下使用的最佳工具吗? 大多数标准库都会有一种方法来检索给定目录中的最后一个路径名。 这还考虑了给定操作系统上的目录分隔符。 - Steve Rukuts
@Raskolnikov 我需要用正则表达式实现。我知道Pth.getFileNameWithoutExtension的用法。问题标记为regex。 - Royi Namir
2
好的,没问题,只是想确认一下。我会把这个交给更擅长正则表达式的人处理。 - Steve Rukuts
7个回答

145

你的负向先行断言解决方案可以是这样的:

\\(?:.(?!\\))+$

在Regexr上查看


4
(?: 表示非捕获组的开始。. 可以匹配任意字符,但是此处表示匹配除了 \ 之外的任意字符。 - stema
1
如果我想要与我的原始问题相同的请求,但不带开头的 \,该怎么办? - Royi Namir
4
(?:[^\\/](?!(\\|/)))+$ 这个正则表达式会去掉开头的斜杠,并适用于前斜杠和反斜杠。对于没有斜杠的路径,例如_manual.doc_,它也将匹配整个字符串。 - mrswadge
5
在Tempered Greedy Token中,点号应该始终出现在展望后面:(?:(?!\\).)+。此外,你在RegExr上的示例使用两个反斜杠来分隔路径组件;实际上只需要一个,而且正则表达式只应匹配一个。 - Alan Moore
如果文件路径中包含 .,则似乎会失败。 - ScottishTapWater
显示剩余4条评论

132

对我有效的方法是:

.+(\\.+)$

在线测试!

说明:

.+     - any character except newline
(      - create a group
 \\.+   - match a backslash, and any characters after it
)      - end group
$      - this all has to happen at the end of the string

36
感谢您将部件分解说明得如此清晰明了 :) - MrsPop88
5
我在寻找一个能够匹配最后一个正斜杠(/)的正则表达式。结果发现,@stema的上面被接受的答案在将反斜杠替换为正斜杠时可以完成该任务。而你的答案匹配每个斜杠后面的所有内容,这并不是所寻求的解决方案。尽管你的解释很简洁,但你的解决方案并没有真正解决问题,我还是给你点了赞。 - Chidozie Nnachor
1
这比负向先行断言要简单得多,而且通常更好,只要它在一行上不被打断,为什么要过度复杂化呢? - Scott Anderson
1
@ChidozieNnachor,关于你的斜杠问题,你在括号前面只放了一个斜杠,就像/(.+)这样吗?这对我来说是有效的,只捕获最后一个斜杠后面的文本。如果它对你无效,可能是因为使用了不同的正则表达式方言。 - Vojta F
@VojtaF,这已经太久远了,我真的不记得了。也许我确实是错的。 - Chidozie Nnachor

65

负向先行断言是正确的答案,但可以更清晰地书写:

(\\)(?!.*\\)

这个代码会找到 \ 的位置,然后在没有匹配的情况下寻找任意数量的字符,再紧接着是你不想看到的字符。因为它是负向匹配,只有当找不到匹配时才算匹配。


6
这只匹配最后一个反斜杠。原 po 希望它也能匹配它之后的所有内容。 - Alan Moore
1
非常有帮助,这个更简洁的版本虽然只捕获反斜杠,但让一切都恍然大悟。谢谢。 - Matt Binford
这个解决方案对我有用。我想获取最后一个出现的元素,它不必在行末。 - Rehan Anis
这帮助我解决了我的目标 - 我正在寻找一个仅匹配5位数字序列的最后模式。([0-9]{5})(?!.*[0-9]{5}) - 我理解这意味着,5个数字 - 不跟随5个数字,同时考虑整个字符串。谢谢。 - Dre Day

32
你可以尝试将其锚定到字符串的末尾,类似于\\[^\\]*$。虽然我不确定是否必须使用正则表达式来完成此任务。

2
这对我非常有帮助。([^ \ /] *)$匹配Linux盒子上路径中的文件名。您能解释一下此上下文中插入符号“^”的作用吗?我之前只用过它来表示字符串的开头。 - Brad
@Brad,这是否定。意思是[^\/]匹配除了斜杠(/)之外的任何字符。 - Michael Krelin - hacker

12

如果您不想包含反斜杠,而只想包含其后的文本,请尝试以下内容:([^\\]+)$ 或者对于Unix系统:([^\/]+)$


我不想要前导斜杠,所以这对我来说是最好和最简单的答案。谢谢。 - undefined

12

这个正则表达式是什么意思:\\[^\\]+$


好的,我认为这不需要在正则表达式中。但我会编辑我的答案。 - SERPRO
我认为这根本不应该是正则表达式,但是对于匹配来说,它应该包含在内。虽然这并不重要,但在看到你的回答被投票下降后,我想到了可能有问题的地方,所以我进行了评论。 - Michael Krelin - hacker
@michael,不要误会,我很感激你的评论,只是我认为在正则表达式中添加\是不必要的。 - SERPRO

4
我使用以下正则表达式来获取该结果,即使它以 \ 结尾。
(\\[^\\]+)\\?$

[Regex Demo]


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