【问题标题】:Substring after a pattern模式后的子字符串
【发布时间】:2017-10-14 17:47:59
【问题描述】:

我有一个字符串:

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

我想为 word3 提取“1398”。我需要路径的值只是“1398”。当我使用:

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

我明白了:

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

谁能给我正确的正则表达式?

【问题讨论】:

标签: ruby regex substring


【解决方案1】:

您可以捕获该部分并使用当前符号轻松获取它:

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+ 数字作为普通匹配文本,无需后视/捕获组:

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

another Ruby demo。在这里,您与\bword3\.woa\. 匹配的所有内容都将被删除,而与[0-9]+ 匹配的内容将进入结果匹配值。

【讨论】:

    【解决方案2】:
    str = 'word2.woa.1398 word3.woa.1398 word4.woa.1398'
    
    str[/(?<=\sword3\.woa\.)\d+/]
      #=> "1398"
    

    (?&lt;=\sword3\.woa\.) 是一个正向后视,要求\d+ 前面紧跟\sword3\.woa\.

    【讨论】:

      【解决方案3】:
      > s = "word1.woa.1398 word2.woa.1398 word3.woa.1398 word4.woa.1398 word5.woa.1398"
      > s.match(/word3.woa.(\d+)/).captures[0]
      => "1398"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-11-09
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-15
        • 1970-01-01
        相关资源
        最近更新 更多