2017-05-12 1 views
0

Ich versuche zu überprüfen, ob Saite (n) in einer Datei vorhanden ist, die unter Option: (versucht, in IRB)Rubin: unable Strings mit Sonderzeichen in einer Datei finden

File.readlines("E:/nano/ABC.txt").grep(/Digital/).any? 
=> true 

gibt mir wahr, so String ist verfügbar, aber wenn ich überprüfen, für ids wie unter

File.readlines("E:/nano/ABC.txt").grep(/ncr\abc_efg_dev/).any? 
=> false 

oder

File.readlines("E:/nano/ABC.txt").grep(/ncr\yui30n/).any? 
=> false 

es gibt false und es ist nicht möglich, die Zeichenfolge zu identifizieren, obwohl sie in der Datei vorhanden ist. Ich bin mir nicht sicher, wie die Existenz der Saiten zu überprüfen - 'ncr\jx8go5' oder 'ncr\atxe5t'

abc.txt

# Digital created on July 2016 
# Digital Owner: John Cena (jxcgo) 
# Digital access: create delete access 

[groups] 
first = ncr\abc_efg_dev, ncr\abc_efg_test, ncr\jx8go5, ncr\atxe5t 
digital_owner = ncr\yui30n, ncr\bhyrl4 
+2

Um einen Backslash wörtlich zu finden, müssen Sie es entkommen. – Stefan

Antwort

1

Sie müssen den Backslash entkommen. Zum Beispiel:

File.readlines("E:/nano/ABC.txt").grep(/ncr\\abc_efg_dev/).any? 

Oder für eine völlig generische Lösung, können Sie Regexp#escape verwenden:

search_string = 'ncr\abc_efg_dev' 
File 
    .readlines("E:/nano/ABC.txt") 
    .grep(Regexp.new(Regexp.escape(search_string))) 
    .any? 

Dies liegt daran, zum Beispiel \a ein Sonderzeichen ist die Bell code genannt.

Andere Beispiele umfassen \n (Neuen-Zeile), \t (tab), \f (form feed), \v (vertical tab), \r (a carriage return), \s (jedes Leerraumzeichen), \b (a Backspace oder Wortgrenze, je nach Kontext), ...

Lange Rede, kurzer Sinn, Sie sollten immer \ in einem regulären Ausdruck (oder einer beliebigen doppelten Anführungszeichenfolge in Ruby!) entkommen, es sei denn, Sie verwenden sie absichtlich, um eine spezielle Bezeichnung zu verwenden Charakter.

+0

Vielen Dank, wie Sie entkommen können, wenn es sich um ein variables Substitutionsszenario handelt. (innerhalb einer Schleife) ZB lese ich String-Werte 1 zu 1 aus einer anderen Datei und überprüfe, ob diese Zeichenfolge in einer der Dateien in einem Ordner vorhanden ist. Values.TXT 'ncr \ yui30n ncr \ bhyrl4 ncr \ abc_efg_dev' check - ncr \ yui30n innerhalb einer foreach-Schleife in eine der Dateien in einem Verzeichnis vorhanden ist, dann prüfen ist ncr \ bhyrl4 in eine der Dateien. so weiter .. – Goku

+1

Für eine vollständig generische Lösung können Sie [Regexp # escape] (https://ruby-doc.org/core/Regexp.html#method-c-escape) verwenden: 'Regexp.new (Regexp. escape ('ncr \ yui30n')) '. Allerdings ist das zugegebenermaßen ein wenig klobig ... Wenn Sie immer nur nach einer literalen Zeichenfolge suchen (dh Sie brauchen wirklich keine Regex zu verwenden), könnten Sie auch [mit 'String # include? (http://stackoverflow.com/a/8414129/1954610). –

+0

Vielen Dank. Ich bin nicht in der Lage, die angegebene Zeichenfolge in mehreren Dateien nacheinander in einer Schleife zu ersetzen. Entschuldigung Ich weiß, dass es nicht ethisch ist, hier zu fragen, aber ich bin nicht sicher, warum die Zieldateien geändert werden unten ist mein Code 'Wert = File.open ('E: \ nano \ out.txt'). lesen Sie value.each_line do | line | line.chomp! \t Dir.glob ("E: \ nano \ *. Txt") do | Dateiname | \t text = File.read (file_name) \t ersetzen = text.gsub (Regexp.escape ("# {line}"), "") \t File.open (file_name, "w") {| Datei | file.puts ersetzen} \t Ende Ende' – Goku