[英]How do I extract this substring within this string?
我有以下文字:
"Showing1-30\nof 1404results"
我想掏出的是1404
。
我怎么做?
我想我會用正則表達式只字之間的匹配字符串of
和results
,但不能完全弄清楚如何做到這一點。
還是有另一種方式,比如說我可以使用的內置Ruby方法高效?
我也在考慮使用split
,但是間距已關閉,因此如下所示:
=> ["Showing1-30", "of", "1404results"]
我該怎么做?
你可以做
["Showing1-30", "of", "1404results"].last.to_i
或使用正則表達式
/of (\d+)results/
匹配“ of”,后跟一個或多個空格,然后在捕獲組1中匹配一個或多個數字,再匹配“結果”,然后檢索捕獲組1的內容。
"Showing1-30\nof 1404results"[/of\s+(\d+)results/,1]
#=> "1404"
要么
匹配以“ of”開頭,后跟一個1空格(正向后)和后跟“結果”(正向前)的字符串
"Showing1-30\nof 1404results"[/(?<=of\s)\d+(?=results)/]
#=> "1404"
要么
匹配“ of”后跟一個或多個空格,忘記到目前為止已匹配的所有內容( \\K
),匹配一個或多個數字后跟“結果”(正向提前)
"Showing1-30\nof 1404results"[/of\s+\K\d+(?=results)/]
#=> "1404"
可能需要將第一個正則表達式更改為
/(?<=of\s)\d+\s*(?=results)/
萬一有人決定“更正”該字符串以"Showing 1-30\\nof 1404 results"[/(?<=of\\s)\\d+(?=results)/]
。 (與其他兩個相同。)
1 Ruby的正向后視不能長短不一; 因此,此處不允許\\s+
。
我會用:
"Showing1-30\nof 1404results"[/(\d+)results/, 1] # => "1404"
"Showing1-30\\nof 1404results"
不是太可讀。 如果您負責生成它,或者它可能會更改為更具可讀性的內容,例如"Showing 1-30\\nof 1404 results"
,那么簡單的調整將有幫助:
"Showing1-30\nof 1404results"[/(\d+)\s*results/, 1] # => "1404"
其中\\s*
將允許0、1或多個空格字符。
保持正則表達式盡可能簡單,直到證明它們需要更復雜為止。 隨着復雜度的增加,匹配變慢的幾率也隨之增加,這在長字符串中可能是非常嚴重的。 同樣,增加一個導致誤報的漏洞的可能性也增加了,這很難調試。
如果此數字的位置固定,則以下是最快的
"Showing1-30\nof 1404results"[-12..-8]
[-12..-8]
是一個范圍,您可以將字符串視為一個字符數組,並指定從右數開始的第8個和第12個位置之間的字符,-1是該行的末尾,-2最后一個字符等。
不然,則是一個正則表達式
"Showing1-30\nof 14results"[/ \d+/].strip
您尋找一個空格后跟一個數字,然后刪除前導空格。 這比必須使用捕獲組要簡單。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.