使用正则表达式时,如何仅获取行中的特定部分?

时间:2013-11-01 17:58:56

标签: ruby-on-rails ruby ruby-on-rails-3

我有这个字符串:

@body = "@JohnM >John Miller_user Howdy! What's up?"

我希望它是:

@body = "Howdy! What's up?"

如何使用正则表达式对gsub进行编码?

以下是更多案例:

gsub之前 - (_user总是在用户名之后。并且在用户名和正文字符串之间总是有空格):

1. `@PaulW >PaulWhite_user Good afternoon`
2. `@Andy >Andy_user Hi!`
3. `@JessicaT >Jessica Turner_user Nooooooooooo`

我想要的输出:

1. `Good afternoon`
2. `Hi!`
3. `Nooooooooooo`

我希望仅在符合此情况时才使用gsub

@*****(space)>*******_user(space)Body string

3 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

yourString.gsub(/(.*(_user ))/,'')

<强>解释

  1. .*将匹配任何字符(发布0次或更多次)
  2. (_user )将匹配确切的字符串"_user "
  3. 合并1和2,将匹配被"(anything)_user "替换的""(没有被删除)
  4. ==================

    如果您想要字符串的所有部分,您可以执行以下操作:

    str = "@Andy >Paul_user Hi!"
    match = /@(.*) >(.*)_user (.*)/.match(str)
    

    将导致:

    match[1] => "Andy"
    match[2] => "Paul"
    match[3] => "Hi!"
    

答案 1 :(得分:1)

试试这个:

/@(.*) >(.*)_user (.*)/

它包括@和大于字符。

答案 2 :(得分:1)

str.match(/_user (.+)/)[1]

"@PaulW >PaulWhite_user Good afternoon".match(/_user (.+)/)[1]       # => "Good afternoon
"@Andy >Andy_user Hi!".match(/user (.+)/)[1]                         # => "Hi!"
"@JessicaT >Jessica Turner_user Nooooooooooo".match(/_user (.+)/)[1] # => "Nooooooooooo"

要了解其工作原理,请查看MatchData对象m

 m = "@PaulW >PaulWhite_user Good afternoon".match(/_user (.+)/)
   => #<MatchData "_user Good afternoon" 1:"Good afternoon"> 

通过将其转换为数组(使用MatchData#to_a):

 m.to_a # => ["_user Good afternoon", "Good afternoon"]

我们看到我们想要的字符串是:

 m.to_a[1] # => "Good afternoon"

MatchData#[]允许我们直接获取:

 m[1] # => "Good afternoon"

顺便说一句,我最初有str.match(/.*_user (.+)/)[1],但后来意识到.*什么也没做,所以删除了它。