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