我想解析以下文字,找到以'+'
或'-'
开头的行:
--- a/product.json
+++ b/product.json
@@ -1,4 +1,4 @@
{
- "name": "Coca Cola",
- "barcode": "41324134132"
+ "name": "Sprite",
+ "barcode": "41324134131"
}
\ No newline at end of file
当我找到这样的行时,我想存储属性名称。即,为:
- "name": "Coca Cola",
我想将name
存储在minus_array
。
答案 0 :(得分:2)
您希望迭代这些行,并找到以-
或+
开头的行,后跟空格:
text = %[
--- a/product.json
+++ b/product.json
@@ -1,4 +1,4 @@
{
- "name": "Coca Cola",
- "barcode": "41324134132"
+ "name": "Sprite",
+ "barcode": "41324134131"
}
\ No newline at end of file
]
text.lines.select{ |l| l.lstrip[/^[+-]\s/] }.map{ |s| s.split[1] }
# => ["\"name\":", "\"barcode\":", "\"name\":", "\"barcode\":"]
lines
在行尾分割一个字符串,返回整行,包括尾随的行尾字符。lstrip
删除该行开头的空格。这是为了规范化线条,使正则表达式更加简单。l.lstrip[/^[+-]\s/]
是一点Ruby String,基本上就是将模式应用于字符串并返回匹配的文本。如果字符串nil
中没有任何匹配项将被返回,就select
而言,它将作为假。如果字符串具有与模式匹配的内容,[]
将返回文本,该文本充当select
的真值,然后传递该字符串。map
遍历select
传递给它的所有元素,并通过在空格上拆分来转换元素,这是split
的默认行为。 [1]
会返回字符串中的 second 元素。这是通往同一地方的另一条路径:
ary = []
text.lines.each do |l|
i = l.strip
ary << i if i[/^\{$/] .. i[/^}$/]
end
ary[1..-2].map{ |s| s.split[1] } # => ["\"name\":", "\"barcode\":", "\"name\":", "\"barcode\":"]
那会让你开始。如何删除重复项,删除前导/尾随双引号和冒号是你的任务。
答案 1 :(得分:0)
text.split(/\n/).select { |l| l =~ /^\+./ }
如果您正在使用文件:
File.open('your_file.txt', "r").select { |l| l =~ /^\+./ }
答案 2 :(得分:0)
File.readlines("file.txt").each do |line|
if line.starts_with? '+ ' || line.starts_with? '- '
words = line.split(":")
key = words[0].match(/".*"/)
val = words[1].match(/".*"/)
# You can then do what you will with the name and value here
# For example, minus_array << if line.starts_with? '-'
end
end
我不完全确定您对此有何限制,因此我无法给出更具体的答案。基本上,您可以使用File.readlines('file') { }
迭代文件的行。然后我们检查要以+
或-
开头的字符串,并相应地获取名称和值。我在starts_with?
中添加了一个空格,因为如果我没有,那么它也会匹配您示例中的前两行。
希望这就是你要找的东西!
答案 3 :(得分:0)
使用group_by
根据第一个字符进行分组:
groups = text.lines.group_by { |l| l[0] }
groups['-']
# => ["--- a/product.json\n", "- \"name\": \"Coca Cola\",\n", "- \"barcode\": \"41324134132\"\n"]
groups['+']
# => ["+++ b/product.json\n", "+ \"name\": \"Sprite\",\n", "+ \"barcode\": \"41324134131\"\n"]