通过regexps提取数据返回nil

时间:2016-06-14 14:10:25

标签: ruby

我试图从解析的PDF中提取一对字符串,我有这个提取:

Number:731    /         13/06/2016                 1823750212                                   10/06/2016\n\n\n\n Articolo

http://rubular.com/r/GRI6j4Byz3

我的目标是获取7311823750212值。

我尝试了text[/Number:(.*)Articolo/]之类的内容,但是它在rubular上有点匹配时会返回nil

任何提示?

2 个答案:

答案 0 :(得分:2)

字符串的格式是固定的(日期和长号),这样做可以解决问题:

text.scan /\ANumber:(\d+).*?(\d{5,})/
#⇒ [[ "731", "1823750212" ]]

答案 1 :(得分:0)

我假设我们不知道要提取的任何一个字符串的长度(非负整数的表示),只是第一个跟在"Number:"之后,它位于字符串的开头,并且第二个之前和之后至少有一个空格。

r = /
    (?<=\A\Number:) # match beginning of string followed by 'Number:' in a
                    # positive lookbehind
    \d+             # match one or more digits
    |               # or
    (?<=\s)         # match a whitespace char in a positive lookbehind
    \d+             # match one or more digits
    (?=\s)          # match a whitespace char in a positive lookbehind
    /x              # free-spacing regex definition mode

str = "Number:731  /  13/06/2016  1823750212  10/06/2016\n\n\n\n Articolo"
str.scan(r)
  #=> ["731", "1823750212"]

如果冒号和"731"之间可能存在间隔空格,您可以按如下方式修改正则表达式。

r = /
    \A      # match beginning of string followed by 'Number:' in a
            # positive lookbehind
    Number: # match string 'Number:'
    \s*     # match zero or more spaces
    \K      # forget everything matched so far
    \d+     # match one or more digits
    |       # or
    (?<=\s) # match a whitespace char in a positive lookbehind
    \d+     # match one or more digits
    (?=\s)  # match a whitespace char in a positive lookbehind
    /x      # free-spacing regex definition mode

str = "Number:  731  /  13/06/2016  1823750212  10/06/2016\n\n\n\n Articolo"
str.scan(r)
  #=> ["731", "1823750212"]

必须使用\K,因为Ruby不支持可变长度的正向外观。