模式之后的子串

时间:2017-05-15 20:12:24

标签: ruby regex substring

我有一个字符串:

str = word1.woa.1398 word2.woa.1398 word3.woa.1398 word4.woa.1398 word5.woa.1398

我想提取" 1398"对于word3。我需要路径的价值只是" 1398"。当我使用时:

path = str[/(?:word3.woa.*)[0-9]+/]

我明白了:

"word3.woa.1398 word4.woa.1398 word5.woa.1398"

有人能为我提供正确的正则表达式吗?

3 个答案:

答案 0 :(得分:0)

> s = "word1.woa.1398 word2.woa.1398 word3.woa.1398 word4.woa.1398 word5.woa.1398"
> s.match(/word3.woa.(\d+)/).captures[0]
=> "1398"

答案 1 :(得分:0)

您可以使用当前符号捕获零件并轻松获取:

path = str[/\bword3\.woa\.([0-9]+)/, 1]
path
# => 1398

请注意,点会被转义以匹配文字点,1表示我们只需要提取第一个捕获组的内容。

请参阅Ruby demo online。另请参阅此Rubular demo(请注意“匹配组:”部分)。

请注意,模式匹配:

  • \b - 字边界
  • word3\.woa\. - word3.woa.文字子字符串
  • ([0-9]+) - 将1个或多个数字捕获到第1组。

Ruby Onigmo正则表达式库支持\K(匹配重置运算符),因此您实际上可能只匹配左侧上下文,并通过在其后面放置\K来丢弃它,并抓住1+数字作为普通匹配文本,不需要lookbehinds / capture groups:

path = str[/\bword3\.woa\.\K[0-9]+/]
path
# => 1398

another Ruby demo。在此处,与\bword3\.woa\.匹配的所有内容都将被删除,与[0-9]+匹配的内容会落在生成的匹配值中。

答案 2 :(得分:0)

str = 'word2.woa.1398 word3.woa.1398 word4.woa.1398'

str[/(?<=\sword3\.woa\.)\d+/]
  #=> "1398"

(?<=\sword3\.woa\.)是一个肯定的背后隐藏,要求\d+\sword3\.woa\.

之后立即开始