从Ruby中的句子中提取一个单词

从Ruby中的句子中提取一个单词,ruby,regex,string,match,Ruby,Regex,String,Match,我有以下字符串: str = "XXX host:1233455 YYY ZZZ!" 我想从这个字符串中提取host:之后的值 在Ruby中,有没有最佳的方法可以使用RegExp来避免多个循环? 欢迎任何解决方案。关于正则表达式: host:(\S+) 在这里您可以找到一个。例如,您可以捕获值 str.match(/host:(\d+)/).captures.first 如果您有数字,请使用以下正则表达式: (?<=host:)\d+ 请注意,如果要匹配字母数字而不是任何标点符号,

我有以下字符串:

str = "XXX host:1233455 YYY ZZZ!"
我想从这个字符串中提取
host:
之后的值

在Ruby中,有没有最佳的方法可以使用RegExp来避免多个循环? 欢迎任何解决方案。

关于正则表达式:

host:(\S+)

在这里您可以找到一个。例如,您可以捕获值

str.match(/host:(\d+)/).captures.first

如果您有数字,请使用以下正则表达式:

(?<=host:)\d+
请注意,如果要匹配字母数字而不是任何标点符号,可以将
\d+
替换为
\w+

此外,如果您的内部也有点或逗号,则可以使用

/(?<=host:)\d+(?:[.,]\d+)*/

请注意,
\b
确保我们将
主机:
作为一个整体来查找,而不是
本地主机:
(\d+)
是一个捕获组,我们可以通过反向引用或
来引用它的值。捕获。首先在Ruby中使用

我看到的一些方法是迭代行中的每个单词,然后比较字符串匹配。
主机:\K.
(?@AvinashRaj谢谢..但你的解决方案对我没有帮助。我原以为你想要
主机
旁边的所有字符。但这在这里被问了n次。因此,请始终尝试在第一时间发布你的尝试。仅供参考:
\S+
的使用可能会导致捕获文本末尾出现不必要的尾随标点。@Stribizev:谢谢你的帮助您的注释。实际上OP没有真正说明值的验证,我们只能猜测它应该是一个数字,但它也可能是一个浮点数字吗?不清楚。@Raj:Avinash Raj的建议是错误的,因为它有
*
匹配任何一个或多个字符。请检查我的。如果您有疑问,请删除com马特。\@stribizhev:在这里使用look behind有什么好处?这样你可以得到一个“更干净”的匹配,而且你不必干预捕获组。当然,在Ruby中,这很方便。另一方面,你也可以使用
str.match(/\bhost:(\d+/).captures.first
。注意,我添加了
\b
-一个单词边界-以匹配
主机
,而不是说,
本地主机
。我明白了这一点。因此,主要是为了避免(单个)捕获组的运行时开销?因为从可读性的角度来看,我会考虑
\b主机:(\d+)
cleaner@user1934428:捕获组在正则表达式中是通用的,因此如果您计划在不同的平台上使用相同的正则表达式,请使用该正则表达式。如果您希望访问值本身的简单性,请使用基于环顾的解决方案。
str[/host:(\d+)/, 1]
# => "1233455"
str.match(/\bhost:(\d+)/).captures.first
str[/host:(\d+)/, 1]
# => "1233455"