Ruby正则表达式不匹配

Ruby正则表达式不匹配,ruby,regex,Ruby,Regex,我正在写一个简短的类来从文档中提取电子邮件地址。以下是我目前的代码: # Class to scrape documents for email addresses class EmailScraper EmailRegex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i def EmailScraper.scrape(doc) email_addresses = [] File.open(doc) do |file| wh

我正在写一个简短的类来从文档中提取电子邮件地址。以下是我目前的代码:

# Class to scrape documents for email addresses

class EmailScraper

  EmailRegex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  def EmailScraper.scrape(doc)
    email_addresses = []
    File.open(doc) do |file|
      while line = file.gets
        temp = line.scan(EmailRegex)

        temp.each do |email_address|
          puts email_address
          emails_addresses << email_address
        end

      end
    end 
    return email_addresses
  end
end


if EmailScraper.scrape("email_tests.txt").empty?
  puts "Empty array"
else
  puts EmailScraper.scrape("email_tests.txt")
end

当我运行这个脚本时,我得到的只是“空数组”打印输出。但是,当我启动irb并键入上面的正则表达式时,电子邮件地址字符串与之匹配,String.scan函数返回每个字符串中所有电子邮件地址的数组。为什么这在irb中有效,而不是在我的脚本中?

看起来您正在将结果放入电子邮件地址,但正在返回电子邮件地址。这意味着您总是返回您为电子邮件地址定义的空数组,以使“空数组”响应正确。

如果您输入错误,请尝试:

class EmailScraper

  EmailRegex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  def EmailScraper.scrape(doc)
    email_addresses = []
    File.open(doc) do |file|
      while line = file.gets
        temp = line.scan(EmailRegex)

        temp.each do |email_address|
          puts email_address
          email_addresses << email_address
        end

      end
    end 
    return email_addresses
  end
end


if EmailScraper.scrape("email_tests.txt").empty?
  puts "Empty array"
else
  puts EmailScraper.scrape("email_tests.txt")

end
类邮件管理器
EmailRegex=/\A[\w+\-.]+@[A-z\d\-.]+\[A-z]+\z/i
def EmailScraper.scrape(文档)
电子邮件地址=[]
文件。打开(doc)do |文件|
而line=file.get
temp=行扫描(EmailRegex)
临时每个do |电子邮件地址|
放入电子邮件地址

您在
\z
末尾使用的电子邮件地址请尝试使用
\z
,因为它必须是大写的z才能匹配字符串的结尾


否则,尝试使用
^
$
(匹配行的开头和结尾)这对我来说很有效

当您读取文件时,行尾会使正则表达式失败。在irb中,可能没有终点线。如果是这样的话,先咬几行

regex=/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
line_from_irb = "example@live.com"
line_from_file = line_from_irb +"/n"

p line_from_irb.scan(regex) # => ["example@live.com"]
p line_from_file.scan(regex) # => []
有几件事(有些已经提到,并在下面进行了扩展):

  • \z
    匹配字符串的结尾,该字符串与IO gets一起通常包含一个
    \n
    字符
    \Z
    (大写字母“Z”)与字符串的结尾匹配,除非字符串以
    \n
    结尾,在这种情况下,它正好在前面匹配
  • 电子邮件地址的打字错误
  • 使用
    \A
    \Z
    可以,而整行是或不是电子邮件地址。你说你想从文档中提取地址,所以我会考虑在每一个结尾使用<代码> \b/COD>来提取由单词边界限定的电子邮件。
  • 您可以使用
    File.foreach()…
    而不是外观笨拙的
    File.open…while…get
    东西
  • 我不相信Regex——已经有大量的工作要做:
这里有一个更聪明的方法:(点击这个奇怪的小图标会带你到一个新的地方)。这篇讨论值得一读,它指出了几个潜在的陷阱

可能会发现更令人难以置信的复杂问题

类邮件管理器
EmailRegex=/\A[\w+\-.]+@[A-z\d\-.]+\[A-z]+\z/i已将\z更改为\z
def EmailScraper.scrape(文档)
电子邮件地址=[]
File.foreach(doc)do | line |#更少的代码,效果相同
temp=行扫描(EmailRegex)
临时每个do |电子邮件地址|

解释
\z
\z
区别的电子邮件地址+1不知道这一点。
regex=/\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
line_from_irb = "example@live.com"
line_from_file = line_from_irb +"/n"

p line_from_irb.scan(regex) # => ["example@live.com"]
p line_from_file.scan(regex) # => []
class EmailScraper

  EmailRegex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\Z/i # changed \z to \Z

  def EmailScraper.scrape(doc)

    email_addresses = []

    File.foreach(doc) do |line| # less code, same effect
      temp = line.scan(EmailRegex)
      temp.each do |email_address|
        email_addresses << email_address
      end
    end         
    email_addresses # "return" isn't needed
  end
end

result = EmailScraper.scrape("email_tests.txt") # store it so we don't print them twice if successful
if result.empty?
  puts "Empty array"
else
  puts result
end