正则表达式替换除特定字符串正则表达式之外的所有内容

时间:2014-07-01 15:17:28

标签: ruby regex gsub

如何使用正则表达式,我会使用"评级 - 小星级评分-4字段_stars_rating csm_review"并使用gsub只返回" rating-4",其中4可以是任何数字?我使用的任何东西只替换部分位

4 个答案:

答案 0 :(得分: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]

答案 1 :(得分: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

答案 2 :(得分:1)

因为你试图保留一些字符串,而不是考虑如何删除任何其他内容而只留下有趣的部分,你应该考虑如何提取字符串的相关部分。带有regexp参数的String#[]方法将是我的选择:

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

答案 3 :(得分:0)

我不会选择纯正的正则表达式,因为它会让你很难阅读:

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

如果您只期望一个元素:

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