正则表达式从字符串的末尾(反向)开始搜索

20

我有一些包含下划线块的字符串。例如:

*Text* _word_ it is something we read every day. _Words in texts_ can be really expressive. _A nice text is a pleasure for your body and soul_ (Oscar Wilde)
在上面的示例中,有三个这样的块,但每个字符串的数量都不同。我只想匹配最后一个,即从行末开始懒惰地跳过字符,直到找到第一个下划线,跳过任何后续字符,直到遇到第二个下划线并停止。

如果我们要查找字符串中第一个块,那么很容易找到类似的块,但是如何找到最后一个呢?


你期望得到什么输出? - SMA
1
我实际上期望有一个匹配。应该匹配倒数第二个_和字符串结尾之间的文本。 - Захар Joe
4
所以,@ЗахарJoe的意思是:“一篇好的文章可以给你的身心带来愉悦感。” - caub
2个回答

23

匹配倒数第二个_符号和字符串结尾之间的文本

使用否定字符类,如

([^.]*$)
它将匹配字符串结尾之前的所有内容,不包括.,因此返回最后一个引号(假设每个引号都以.结束)。 http://regex101.com/r/fA3pI7/1

嗯,在我这种情况下并不完全适用。有时最后一个 _ _ 块包含由点分隔的多个句子。我明确要匹配倒数第二个 _(下划线)。同样,有时字符串本身以句点结尾。 - Захар Joe
你是否使用任何编程语言来处理结果,还是只需要使用正则表达式得到答案? - ʰᵈˑ
我使用TextMate文本编辑器来处理这些行,因此它应该只是一个表达式。 - Захар Joe
3
你的解决方案非常出色:简洁而优雅。谢谢。虽然它可能对原帖作者无效,但对于反向搜索,在许多应用程序中非常有用。例如,从完整路径中提取文件名,我们可以使用 "[^/]*$" - Lazarus Thurston

11

试一下:

((?:_[^_\r\n]*){2})$

它匹配一个下划线,后面跟着任意数量的不是下划线或换行符的任何字符,这些字符都会在行末之前出现两次。


M,嘿,有进展了!它可以工作,但有一个问题/错误:它会匹配到下一行中的任何下划线。也就是说,如果紧随所需匹配的行的行没有下划线,则结果将扩展到包含第一个包含下划线的行。但该行不会被包括在内,只有它之前的行会被包括在内。例如:1:这是一行带有匹配和杂项的_的行_ 2:这只是一个简单的行3:另一行4:现在我们再次有匹配项。表达式将匹配从1:_stuff到3:行的所有内容。 - Захар Joe
@ЗахарJoe:请看我的修改,我添加了换行符。这样可以工作吗? - Toto
M42,完美地工作了!然而这并不是结束,如果您能解释一下是如何实现的,其他遇到类似问题的人也会感激不尽。这个表达式相当高级。 - Захар Joe

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