我有一个包含以下数据的文件:
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)
还有更好的方法吗?使用文件步骤
你可以这样做,使用带有正则表达式的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)
接下来是一个或多个字母,然后是一个或多个数字,然后是行尾,其包括要匹配的模式.如果您有不同的要求,当然可以更改此设置,例如名称为小写或以大写字母开头,指定的位数等等.