【问题标题】:Regex to extract number between brackets that are after a hashtag in ruby正则表达式在 ruby​​ 中提取主题标签之后的括号之间的数字
【发布时间】:2013-10-08 06:30:57
【问题描述】:

我有以下格式的字符串:

'I had a great time with @[2468] and @[1357]! #[1111] #[2321]#[1212]'

我希望能够提取 @ 和 # 符号之间的数字,但我不想要包含的方括号。例如我想返回:

user_ids = [2468, 1357]
hash_tag_ids = [1111, 2321, 1212]

有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails ruby regex hashtag


    【解决方案1】:

    因为你想匹配所有出现的模式,string.scan 方法就是你想要的。 Scan 会自动返回与模式匹配的所有内容,因此您不需要使用“捕获组”(您在大多数正则表达式中看到的括号),但您确实需要使用“lookahead”和“lookbehind”来匹配一些没有将其包含在您的结果中。

    你需要的两行是:

    string.scan(/(?<=@\[)\d+(?=\])/).map(&:to_i) # => [2468, 1357]
    string.scan(/(?<=#\[)\d+(?=\])/).map(&:to_i) # => [1111, 2321, 1212]
    
    • (?&lt;=...) 创建一个“正向后视”,确保前面的字符匹配 ...,但这些字符不包含在匹配的文本中。也就是说(?&lt;=@\[)会匹配“@[”,但string.scan返回的结果中不会包含“@[”。
    • 注意左方括号,右方括号前面有一个斜线。这是因为方括号在正则表达式中具有特殊含义(它们创建“字符类”),但由于我们要匹配文字方括号,因此必须用斜线“转义”它们。
    • \d+ 表示匹配 1 个或多个数字。
    • (?=...) 创建一个“正向前瞻”,以确保以下字符与 ... 匹配,但这些字符不包含在匹配的文本中。与上面的lookbehind 相同,但检查后面的字符而不是前面的字符。在这种情况下,(?=\]) 匹配“]”,但在string.scan 返回的结果中不包含“]”。
    • string.scan 将返回一个字符串数组。 .map(&amp;:to_i) 部分将对每个字符串运行 string.to_i 以返回一个实际的整数值。

    【讨论】:

      【解决方案2】:
      string.scan(/(?<=@\[)[^\]]*(?=\])/) # => ["2468", "1357"]
      string.scan(/(?<=#\[)[^\]]*(?=\])/) # => ["1111", "2321", "1212"]
      

      【讨论】:

        猜你喜欢
        • 2018-12-24
        • 1970-01-01
        • 2021-06-26
        • 2011-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多