【问题标题】:Ruby Regular Expression ExcludingRuby 正则表达式排除
【发布时间】:2011-02-28 01:50:27
【问题描述】:
@message_to = 'bob@google.com'

@cleaned = @message_to.match(/^(.*)+@/)

@cleaned 正在返回 bob@,我希望它只返回 bob。我在用 ruby​​ 做正则表达式吗?

谢谢

【问题讨论】:

  • 我认为正则表达式和电子邮件地址是开发人员的某种网关药物组合。这是一个值得讨论的问题和关于这对的讨论:Why are people using regexp for email and other complex validation?
  • @the Tin Man:所有程序员都是真正失败的巫师,宁愿施法,正则表达式闻起来像咒语,所以对他们有一种天然的亲和力。
  • @mu 太短了,哈哈。是的,很有可能。我一直认为这是一个大男子主义的事情。

标签: ruby regex


【解决方案1】:

不需要太多正则表达式

>> @message_to = "bob@google.com"
=> "bob@google.com"
>> @message_to.split("@",2)
=> ["bob", "google.com"]
>> @message_to.split("@",2)[0] if @message_to["@"]
=> "bob"
>>

【讨论】:

  • +1:人们确实倾向于对所有事情都使用正则表达式,不应忽视基本的字符串修改。
  • +1 这是古老的“当你有一把锤子时,一切看起来都像钉子。”情况。正则表达式是一个强大的工具,但我发现它通常会导致代码混乱,而不是让它更清晰、更干净、更易于维护。
【解决方案2】:

你想要这个:

@cleaned = @message_to.match(/^(.*)+@/)[1]

match 返回一个MatchData 对象,该对象的字符串版本是整个匹配项,当您处理MatchData as an array 时,捕获的组从索引1 开始可用。

不过,我可能会选择更像这样的东西:

@cleaned = @message_to.match(/^([^@]+)@/)[1]

【讨论】:

    【解决方案3】:

    有一个更短的解决方案:

    @cleaned = @message_to[/[^@]+/]
    

    【讨论】:

      【解决方案4】:

      比 mu_is_too_short 更短的代码是:

      @cleaned = @message_to[/^([^@]+)@/, 1]
      

      String#[] 方法可以采用正则表达式。

      【讨论】:

        【解决方案5】:

        我在 IRB 控制台中使用的最简单正则表达式是:

        @message_to = 'bob@google.com'
        @cleaned = @message_to.match(/(.+)@/)[1]
        

        你也可以试试这个link

        @cleaned = @message_to.match(/^(?<local_part>[\w\W]*?)@/)[:local_part]
        

        【讨论】:

          【解决方案6】:

          调整代码最明显的方法是使用前向肯定断言。现在不是说“匹配bob@”,而是说“匹配bob,然后是@

          @message_to = 'bob@google.com'
          
          @cleaned = @message_to.match(/^(.*)+(?=@)/)
          

          关于何时使用和不使用正则表达式的进一步说明:是的,在这种情况下使用正则表达式有点毫无意义。但是当您使用正则表达式时,添加验证也更容易:

          @cleaned = @message_to.match(/^(([-a-zA-Z0-9!#$%&'*+\/=?^_`{|}~]+.)*[-a-zA-Z0-9!#$%&'*+\/=?^_`{|}~]+(?=@)/)
          

          (是的,所有这些都在电子邮件地址中有效)

          【讨论】:

          • “但是当你使用正则表达式时,添加验证也更容易”,除了那些并没有真正涵盖电子邮件地址的所有极端情况,或者测试它是否是一个实时地址,这是真实世界的测试。 Perl 的Mail::RFC822::Address 模块具有make_rfc822re 函数,它可以很好地生成符合RFC 的regex。这是一个相关的讨论:stackoverflow.com/q/211842/128421
          猜你喜欢
          • 2014-12-14
          • 1970-01-01
          • 1970-01-01
          • 2011-08-06
          • 2016-11-27
          • 2021-09-16
          • 2014-04-11
          • 2016-05-09
          • 2013-06-08
          相关资源
          最近更新 更多