gpt4 book ai didi

Ruby 正则表达式不匹配

转载 作者:数据小太阳 更新时间:2023-10-29 08:29:01 25 4
gpt4 key购买 nike

我正在编写一个简短的类(class)来从文档中提取电子邮件地址。到目前为止,这是我的代码:

# 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

我的“email_tests.txt”文件如下所示:

example@live.com
another_example90@hotmail.com
example3@diginet.ie

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

最佳答案

几件事(有些已经在下面提到并在下面展开):

  • \z 匹配字符串的末尾,IO#gets 通常会包含一个 \n 字符。 \Z(大写 'z')匹配字符串的结尾除非字符串以 \n 结尾,在这种情况下它匹配就在之前。
  • emails_addresses 的拼写错误
  • 使用 \A\Z 都可以,无论整行是还是不是电子邮件地址。但是,您说您正在寻求从文档中提取地址,所以我会考虑在每一端使用 \b 来提取由单词边界分隔的电子邮件。
  • 你可以使用 File.foreach()... 而不是笨拙的 File.open...while...gets
  • 我不相信 Regex - 已经有大量的工作:

这里有一个更聪明的:http://www.regular-expressions.info/email.html (单击那个奇怪的小内联图标会将您带到 piece-by-piece explanation )。值得一读的讨论,它指出了几个潜在的陷阱。

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

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

关于Ruby 正则表达式不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6426274/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com