簡體   English   中英

ruby正則表達式匹配字符串的結尾

[英]ruby regex match from end of string

我今天在某地讀過,SO中的正則表達式標簽最能“給我ze代碼”類型的問題,所以我謹慎地問...我試過了,但如果這是重復的,請告訴我,以便我可以刪除。

[First]sometext[Second]

我想在Ruby中使用Regex在second []之間返回值:

Second

我到目前為止:

(?<=\[)(.*)(?=\])

返回

First]sometext[Second

\[.*?(\[)

這個分組將返回

[First]sometext[

所以我一直在努力以某種方式混合這兩個但沒有運氣..希望有人可以提供幫助。

我在SO中找到的最接近的參考文獻是在“正則表達式中匹配第二或第n次出現”中搜索的,我無法在我的問題上使用它。

我的解決方法是使用gsub將[First]和“”替換為初始字符串:

\[(.*?)\]

然后做另一場比賽..但我想知道如何使用正則表達式使用。

> s = "ipsum[First]sometext[Second]lorem"
=> "ipsum[First]sometext[Second]lorem"
> s =~ /\[.*?\].*?\[(.*?)\]/
=> 5
> $1
=> "Second"

為什么不在開頭使用貪婪的搜索.*盡可能多地捕獲?

^.*\[(.*?)\]

演示

然后你可以通過附加來使它不貪婪(僅捕獲第一個[...]塊中的東西) ? 作為^.*?

有很多方法可以解決這個問題。 尚未提及的是輸入錨點$的結束。

s = "[First]sometext[Second]"
s.match(/[\[][^\[]+[\]]$/)  # => #<MatchData "[Second]">
s.match(/[\[]([^\[]+)[\]]$/)  # => #<MatchData "[Second]" 1:"Second">

這僅適用於[something]結束字符串的特定情況。

'anchors'部分描述了$\\z\\Z之間的細微差別。

http://www.ruby-doc.org/core-2.1.2/Regexp.html

你很親密 使用此選項捕獲第一個捕獲組中的相關部分,然后使用$1訪問它

.*?\\[.*?\\[(.*?)\\].*

如果你只想要一個包含任意數量的[..]的字符串中的最后一個[..]所包含的文本,這可能會更方便。 [編輯:我會離開這個,但@OnlineCop有一個更好的解決方案,我在上一句中描述的目標。 這也是原始問題的絕佳答案。 ]

反轉字符串,然后在非捕獲組(?:\\])搜索帶有捕獲]的正則表達式的子字符串,捕獲*.? 在捕獲組1( ?使它非貪婪)和捕獲[第二非捕獲組中使用。 最后,檢索並反轉捕獲組1中包含的字符串:

str = "The [first] time I was mad.  The [second] time I was irate!"
str.reverse[/(?:\])(.*?)(?:\[)/,1].reverse #=> "second"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM