【问题标题】:ruby, using regex to find something in between two stringsruby,使用正则表达式在两个字符串之间查找内容
【发布时间】:2018-11-01 08:22:38
【问题描述】:

使用 Ruby + 正则表达式,给出:

starting-middle+31313131313@mysite.com

我只想获取:31313131313

即,starting-middle+mysite.com 之间是什么

这是我目前所拥有的:

to = 'starting-middle+31313131313@mysite.com'

to.split(/\+/@mysite.com.*/).first.strip

【问题讨论】:

标签: ruby regex


【解决方案1】:

在第一个 + 和第一个 @ 之间:

to[/\+(.*?)@/,1]

在第一个 + 和最后一个 @ 之间:

to[/\+(.*)@/,1]

在最后一个+ 和最后一个@ 之间:

to[/.*\+(.*)@/,1]

在最后一个 + 和第一个 @ 之间:

to[/.*\+(.*?)@/,1]

【讨论】:

  • to[/\+(.*?)@/,1] - 数字 1 是在字符串中找到的第一个匹配项?
  • @stack1,是的,它适用于 第一个 () 中的内容。就像其他语言中的 .match(//)[1].match(//).group(1) 一样。通常您在应用正则表达式时检索单个子字符串,因此 ,1 在 Ruby 中相当常见。
【解决方案2】:

这是一个没有正则表达式的解决方案(我更容易阅读):

i = to.index("+")
j = to.index("@")
to[i+1..j-1]

【讨论】:

  • 这行得通,但它的代码行太多了 :) 顺便说一句,你从哪里得到关于你的代码测验网站的问题?
  • @stack1- CodeQuizzes 上的所有问题都是我自己编的 :)
【解决方案3】:

如果您关心可读性,我建议只使用“split”,如下所示: string.split("from").last.split("to").first 或者,在你的情况下:

to.split("+").last.split("@").first

如果有更多的 '+' 或 '@' 出现,则使用限制 2 只关心第一次出现: to.split("+",2).last.split("@",2).first

【讨论】:

    【解决方案4】:

    这是一个基于正则表达式lookbehind和lookahead的解决方案。

    email = "starting-middle+31313131313@mysite.com"
    regex = /(?<=\+).*(?=@)/
    regex.match(email)
    => #<MatchData "31313131313">
    

    说明

    1. 如果您想匹配某项后跟某项其他内容,则前瞻是必不可少的。在你的情况下,它是一个后跟@的位置,表示为(?=@)

    2. Lookbehind 具有相同的效果,但向后工作。它告诉正则表达式引擎在字符串中暂时后退,以检查lookbehind中的文本是否可以在那里匹配。在您的情况下,它是+ 之后的位置,表示为(?&lt;=\+)

    所以我们可以将这两个条件结合在一起。

    lookbehind   (what you want)   lookahead
        ↓              ↓             ↓
     (?<=\+)           .*          (?=@)
    

    参考

    Regex: Lookahead and Lookbehind Zero-Length Assertions

    【讨论】:

      猜你喜欢
      • 2012-05-19
      • 1970-01-01
      • 2020-05-28
      • 1970-01-01
      • 2020-11-30
      • 1970-01-01
      • 2012-05-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多