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