鉴于我有以下字符串:
String 1 | string 2 | string 3
我希望我的正则表达式匹配最后一个管道和空格之后的值,在这种情况下,该值是“字符串3”。
现在我正在使用此命令:/[^|]+$/i
,但它还会在管道后面返回空格字符。
答案 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"