簡體   English   中英

如何在此字符串中提取此子字符串?

[英]How do I extract this substring within this string?

我有以下文字:

"Showing1-30\nof 1404results"

我想掏出的是1404

我怎么做?

我想我會用正則表達式只字之間的匹配字符串ofresults ,但不能完全弄清楚如何做到這一點。

還是有另一種方式,比如說我可以使用的內置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.

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