gpt4 book ai didi

ruby - 如何使用一行正则表达式来获取匹配的内容

转载 作者:数据小太阳 更新时间:2023-10-29 06:26:23 26 4
gpt4 key购买 nike

我是 ruby​​ 的新手,我想知道我是否可以只用一行来完成这项工作。

以本站的“搜索”为例。当用户键入 [ruby] regex 时,我可以使用以下代码获取标签和关键字

'[ruby] regex' =~ /\[(.*?)\](.*)/
tag, keyword = $1, $2

我们可以只写一行吗?


更新

非常感谢!我可以让它更难更有趣吗,输入可能包含多个标签,例如:

[ruby] [regex] [rails] one line

是否可以使用一行代码获取标签数组和关键字?我试过了,但失败了。

最佳答案

您需要 Regexp#match 方法。如果您编写 /\[(.*?)\](.*)/.match('[ruby] regex'),这将返回一个 MatchData 对象。如果我们称该对象为 matches,则除其他事项外:

  • matches[0] 返回整个匹配的字符串。
  • matches[n] 返回第 n 个捕获组 ($n)。
  • matches.to_a 返回一个由 matches[0]matches[N] 组成的数组。
  • matches.captures 返回仅包含捕获组(matches[1]matches[N])的数组。<
  • matches.pre_match 返回匹配字符串之前的所有内容。
  • matches.post_match 返回匹配字符串后的所有内容。

方法比较多,对应其他特殊变量等;你可以查看MatchData's docs更多。因此,在这种特定情况下,您只需编写

tag, keyword = /\[(.*?)\](.*)/.match('[ruby] regex').captures

编辑 1: 好吧,对于更艰巨的任务,您需要使用 String#scan 方法,@Theo用过的;但是,我们将使用不同的正则表达式。以下代码应该有效:

# You could inline the regex, but comments would probably be nice.
tag_and_text = / \[([^\]]*)\] # Match a bracket-delimited tag,
\s* # ignore spaces,
([^\[]*) /x # and match non-tag search text.
input = '[ruby] [regex] [rails] one line [foo] [bar] baz'
tags, texts = input.scan(tag_and_text).transpose

input.scan(tag_and_text) 将返回标签-搜索-文本对列表:

[ ["ruby", ""], ["regex", ""], ["rails", "one line "]
, ["foo", ""], ["bar", "baz"] ]

transpose 调用会翻转它,这样您就有了一对由标签列表和搜索文本列表组成的列表:

[["ruby", "regex", "rails", "foo", "bar"], ["", "", "one line ", "", "baz"]]

然后您可以对结果做任何您想做的事情。我可能会建议,例如

search_str = texts.join(' ').strip.gsub(/\s+/, ' ')

这会将搜索片段与单个空格连接起来,去除前导和尾随空格,并将多个空格替换为单个空格。

关于ruby - 如何使用一行正则表达式来获取匹配的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3090786/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com