如何匹配模式的最后一次出现?

时间:2019-01-11 20:51:44

标签: ruby regex

鉴于我有以下字符串:

String 1 | string 2 | string 3

我希望我的正则表达式匹配最后一个管道和空格之后的值,在这种情况下,该值是“字符串3”。

现在我正在使用此命令:/[^|]+$/i,但它还会在管道后面返回空格字符。

https://regex101.com/r/stnW0D/1

3 个答案:

答案 0 :(得分:1)

没有正则表达式:

const user = {
  firstName: 'Ciofliceanu',
  lastName: 'Serban'
};

答案 1 :(得分:0)

'String 1 | string 2 | string 3'[/(?<=\|\s)(\w+\s\d+\z)/]
# "string 3"

(已转义)的位置

\|  # a pipe
\s  # a whitespace
\w+ # one or more of any word character
\s  # a whitespace
\d+ # one or more digits
\z  # end of string

(...)    # capture everything enclosed
(?<=...) # a positive lookbehind

在这种情况下,请注意,正则表达式已经通过将其附加到字符串(\ z)的末尾来获取字符串中最后一次出现的模式。在其他情况下,您可以使用[\|\s]?而不是(\ | \ s)来匹配字符串,后跟一个空格和一个数字,然后从那里访问返回数组中的最后一个元素:

'String 1 | string 2 | string 3'.scan(/[\|\s]?(\w+\s\d+)/).last
# ["string 3"]

答案 2 :(得分:0)

str = "string 1 | string 2 | string 3"

r = /
    .*  # match any number of any character (greedily)
    \|  # match a pipe
    [ ] # match a space
    \K  # forget everything matched so far  
    .+  # match remainder of string
    /x  # free-spacing regex definition mode

str[r]
  #=> "string 3"

常规表达通常如下:

r = /.*\| \K.+/

当以自由间距模式编写它时,管道后面的空格将被封闭在一个字符类中,否则Ruby会将其转换为一个空字符串。

这里的关键是默认情况下,开头的.*是贪婪的,因此它将吞噬字符,直到到达最后一个管道后跟一个空格为止。

还有其他两种方式:

str[2 + str.rindex('| ')..-1]
  #=> "string 3" 

str.reverse[/.*?(?= \|)/].reverse
  #=> "string 3" 
相关问题