2014-07-01 21 views

回答

1

而不是試圖取代所有的單詞的位置或想要匹配的數位的位置後,更好的方法是match子模式貫穿整個字符串。

string.match(/\b[a-z]+-\d+\b/i) 

說明:

詞邊界不消耗任何字符。它斷言,一方面有一個字的字,另一方面則沒有。

\b  # the boundary between a word char (\w) and not a word char 
[a-z]+ # any character of: 'a' to 'z' (1 or more times) 
-  # '-' 
\d+  # digits (0-9) (1 or more times) 
\b  # the boundary between a word char (\w) and not a word char 
+1

請解釋downvoter? – hwnd

+0

我沒有低調,但*你*需要解釋爲什麼你是一個更好的方法。扔掉代碼沒有解釋就像扔OP的魚。反而教OP如何釣魚。好的答案有代碼並解釋它是如何工作的。 –

+0

@hwnd:現在你停止使用(g)sub,我解開了我的downvote。刪除字符串中的所有內容並不是獲得您要查找的內容的好方法,儘管這是OP最初要求的。 – Linuxios

2

gsub這裏是錯誤的選擇。它將使更多的意義,做這樣的事情:

"ratings-small star rating-4 field_stars_rating csm_review".match(/\brating-\d\b/).to_s 

因爲你要找的字符串的具體部分,它更有意義,直接爲搜索。

先手連字符後的數字,使用此:

"ratings-small star rating-4 field_stars_rating csm_review".match(/\brating-(\d)\b/)[0] 
+0

這真的很好!問題是,我比較新的正則表達式,你能解釋\ b的含義嗎?非常感謝! – user3794461

+0

另外,我怎樣才能使它只返回數字,但仍檢查它是在適當的格式? – user3794461

+0

@ user3794461:'\ b'匹配一個空格。至於獲取號碼,請參閱我的編輯。 – Linuxios

0

我不會爲這個純正則表達式去,因爲這將使得它非常難以閱讀:

string = "ratings-small star rating-4 field_stars_rating csm_review" 
string.split.select {|s| s =~ /^rating-\d$/}.join(' ') 

如果您期望只有一個元素:

string[/\brating-\d\b/] 
+3

我不確定你的代碼比簡單的正則表達式更容易閱讀:'string [/(rating- \ d +)/,1]'。 –

1

由於您試圖保留一些字符串,而不是想到h你可以刪除其他任何東西只留下有趣的位,你應該考慮如何提取字符串的相關部分。帶有正則表達式參數的String#[]方法將是我的選擇:

string = "ratings-small star rating-4 field_stars_rating csm_review" 
string[/\brating-\d\b/] 
# => "rating-4"