使用Ruby和Grep从File中提取名称

3 ruby grep

我有一个包含以下数据的文件:

other data
user1=name1
user2=name2
user3=name3
other data
Run Code Online (Sandbox Code Playgroud)

提取我做以下的名称

names = File.open('resource.cfg', 'r') do |f|
  f.grep(/[a-z][a-z][0-9]/)
end
Run Code Online (Sandbox Code Playgroud)

返回以下数组

user1=name1
user2=name2
user3=name3
Run Code Online (Sandbox Code Playgroud)

但我真的只想要名字部分

name1
name2
name3
Run Code Online (Sandbox Code Playgroud)

现在我在文件步骤后执行此操作:

names = names.map do |name|
  name[7..9]
end
Run Code Online (Sandbox Code Playgroud)

还有更好的方法吗?使用文件步骤

Car*_*and 5

你可以这样做,使用带有正则表达式的String#scan:

File.read(FNAME).scan(/(?<==)[A-Za-z]+\d+$/)
Run Code Online (Sandbox Code Playgroud)

说明

让我们从构建文件开始:

FNAME = "my_file"

lines =<<_
other data
user1=name1
user2=name2
user3=name3
other data
_

File.write(FNAME,lines)
Run Code Online (Sandbox Code Playgroud)

我们可以确认文件内容:

puts File.read(FNAME)
other data
user1=name1
user2=name2
user3=name3
other data
Run Code Online (Sandbox Code Playgroud)

现在运行代码::

File.read(FNAME).scan(/(?<==)[A-Za-z]+\d+$/)
  #=> ["name1", "name2", "name3"]
Run Code Online (Sandbox Code Playgroud)

关于我使用的正则表达式的一个词.

(?<=...)
Run Code Online (Sandbox Code Playgroud)

被称为"积极的外观".无论插入什么代替点都必须紧接在匹配之前,但不是匹配的一部分(因此有时称为"零长度"组).我们希望匹配遵循等号,因此"正面看后"如下:

(?<==)
Run Code Online (Sandbox Code Playgroud)

接下来是一个或多个字母,然后是一个或多个数字,然后是行尾,其包括要匹配的模式.如果您有不同的要求,当然可以更改此设置,例如名称为小写或以大写字母开头,指定的位数等等.