始终在数组中分隔值

时间:2015-03-23 17:30:05

标签: ruby arrays regex string

上传文件后,我将文件的每一行放入一个数组中。 我想只保存数组的一部分,这里是一个数组的例子......

[ "1, \"Hlavní\"\n", "2, OK\n", "3618, \"Duplicitní záznamy\"\n", "3619, \"Anyth1ng_ Go@es /n th7s'me??\"\n" ]

我想将字符串修剪为......

[ "Hlavní", "OK", "Duplicitní záznamy", "Anyth1ng_ Go@es /n th7s'me??" ]

我可以确定的一件事是它始终位于\"\",\n之间,我试过抓文但不要知道如何让它如此精确。

这是上传的一个文件:

#INDEX  STRING
0, "Deutsch"
# Main
1, "Hauptmenü"
2, "Sonstiges"
3, "Kontrolle"
4, "Datei Ansicht"
5, "Laden..."
6, "Registriert"
7, "Nicht registriert"
8, "Ja"
9, "Nein"
10, "Anrufen"
11, "Suchen"
12, "Neu"
13, "Bearbeiten"
14, "Löschen"
15, "Alle löschen"
16, "Zurück"
17, "Zurück zum Hauptverzeichnis"
18, "Optionen"
19, "Speichern"

另一个

#Comment 1-500
1, Ende
2, OK
3, Abbrechen
4, Senden
5, Ja
6, Nein
7, Ein
8, Aus
9, Start
10, Stopp
11, Pause
12, Standard
13, Alle
14, Titel
15, Benutzerdefinierte Sprache

#Call 501-999
501, Telefon
503, Wählen...
504,

3 个答案:

答案 0 :(得分:2)

这是一个选择:

arr = [ "1, \"Hlavní\"\n",
        "2, OK\n",
        "3618, \"Duplicitní záznamy\"\n",
        "3619, \"Anyth1ng_ Go@es /n th7s'me??\"\n" ]

r = /,\s+"\K.+?(?=")|,\s+\K.+?(?=\n)/    
arr.map { |s| s[r] }
  #=> ["Hlavní", "OK", "Duplicitní záznamy", "Anyth1ng_ Go@es /n th7s'me??"] 

我要求字符串前面有, \",。前者比指定的匹配要求稍强;如果不合适,它可以以明显的方式削弱。我使用\K(匹配之前的内容,但不包括在匹配中)而不是正面的lookbehind,以允许在逗号后面有不同数量的空格。

让我们仔细看看正则表达式。通过在末尾添加x(“扩展”),我们可以将其串在几条注释行上:

r = /
  ,\s+   # match a comma followed by one or more whitespace chars
  "      # match `"`
  \K     # forget what has been matched previously
  .+?    # match any number of any character, lazily
  (?=")  # match must be immediately followed by `"` (positive lookahead)
  |      # match what has been matched so far or is matched later ("or")
  ,\s+   # as above
  \K     # as above
  .+?    # as above
  (?=\n) # match to be immediately followed by `\n` (positive lookahead)
/x

让我们确认正则表达式可以这样写:

arr.map { |s| s[r] }
  #=> ["Hlavní", "OK", "Duplicitní záznamy", "Anyth1ng_ Go@es /n th7s'me??"]

注意:

  • ?跟随.+使匹配变得懒惰(“非贪婪”),以便在匹配的以下元素("\n)时停止找到,而不是吞噬所有内容,直到它找到字符串中的最后一个"\n;
  • 两个正向前瞻是“零宽度”,这意味着他们不消耗字符不属于匹配。

也可以这样写:

arr.map { |s| s[/,\s+\K(?:"\K.+?(?=")|.+?(?=\n))/] }

答案 1 :(得分:1)

[ "1, \"Hlavní\"\n", "2, OK\n", "3618, \"Duplicitní záznamy\"\n", "3619, \"Anyth1ng_ Go@es /n th7s'me??\"\n" ]
.map{|s| s[/(?<=")[^"]*(?=")/]}
# => ["Hlavní", nil, "Duplicitní záznamy", "Anyth1ng_ Go@es /n th7s'me??"]

请注意,根据您的请求,结果中的第二个元素为nil(在\"\"之间提取元素。)

答案 2 :(得分:0)

我认为所选择的答案不是最好的,这里更好。

@upload = File.new(@request.attachment.path)
@messages = File.read(@upload).scan(/\s+"?([^"\n]*)(?:"|\n)/).flatten