Ruby entspricht grep -v

8

Das habe ich stattdessen gemacht:

%Vor%

Ich habe das Gefühl, dass das ein wenig unhandlich ist, aber ich habe nichts eingebaut, das mich in my_array.grepv /regex/ { ... }

ändern würde

Gibt es eine solche Funktion?

    
Hsiu 12.11.2010, 15:08
quelle

10 Antworten

7

Weißt du, wie Symbol#to_proc beim Verketten hilft? Sie können das gleiche mit regulären Ausdrücken tun:

%Vor%

Aber Sie sollten es wahrscheinlich nicht tun. Grep funktioniert nicht nur mit regulären Ausdrücken - Sie können es wie folgt verwenden

%Vor%

und wenn du grep -v willst, musst du Class#to_proc implementieren, was falsch klingt.

    
Andrew Grimm 17.11.2010 23:02
quelle
6

Ruby 2.3 implementiert eine Enumerable#grep_v -Methode, die genau das ist, wonach Sie suchen.

Ссылка

    
PJSCopeland 23.11.2015 22:19
quelle
4

Was ist mit dem Invertieren der Regex?

%Vor%     
Ahmed Al Hafoudh 02.07.2014 17:19
quelle
4

Wie wäre es damit?

%Vor%

Ich habe absichtlich eine Kopie eingefügt, um sicherzustellen, dass alle zurückgegeben werden.

    
Kelvin 12.11.2010 19:30
quelle
3

Ich glaube nicht, dass es so etwas eingebaut hat, aber es ist einfach genug hinzuzufügen:

%Vor%

Beachten Sie, dass Sie beim Aufruf dieser Funktion parens um die Regex herum verwenden müssen, andernfalls erhalten Sie einen Syntaxfehler:

%Vor%     
wdebeaum 12.11.2010 16:18
quelle
1

Sie können:

%Vor%

Aber es ist wirklich schwer, prägnanter und selbstdokumentierend zu sein. Es könnte geschrieben werden mit grep(/.../) mit einigen negativen Lookahead-Muster, aber dann denke ich, es wird schwieriger, die gesamte Aktion zu verstehen, weil das Muster selbst schwerer zu verstehen ist.

    
the Tin Man 12.11.2010 16:07
quelle
0

Sie müssen einfach das Ergebnis der regexp-Übereinstimmung negieren.

%Vor%     
bltxd 12.11.2010 17:13
quelle
0

Vielen Dank für Ihre Kommentare. Am Ende habe ich es so gemacht:

%Vor%

Ich bin mir nicht sicher, ob das der beste Weg ist, weil ich gerade mit Ruby anfange. Es ist hier ein wenig länger als die Lösungen anderer Leute, aber ich mag es, weil es ziemlich analog zur grep -Option von Enumerable ist - es funktioniert mit allem, was mit dem ==5, genau wie grep, zusammenhängt und die gefundenen Elemente liefert, wenn ein Block gefunden wurde gegeben, und beide Wege gibt ein Array von denen, die nicht übereinstimmen.

Ich habe den or to_s -Teil hinzugefügt, damit alle Integer, die beispielsweise im Array vorkommen, mit demselben Regex verglichen werden können, obwohl ich mir vorstellen könnte, dass dies manchmal Probleme verursachen könnte.

    
Hsiu 17.11.2010 08:54
quelle
0

Versuchen Sie es mit Array#collect!

%Vor%

BEARBEITEN: Entschuldigung, dann müssten Sie Array#compact nachher aufrufen. Zumindest würde das den zweiten Block eliminieren. Aber es ist mehr physikalischer Code. Es hängt davon ab, wie viel "Zeug" du tust.

    
Jeremy 12.11.2010 15:58
quelle
0

Hier ist eine weitere Einstellung, mit einer Prise bltxd und Hsiu die Antworten und hoffentlich so viel von der ursprünglichen grep wie möglich behalten (auch wenn es wortreich ist):

%Vor%

Wenn Sie einen Block bereitstellen, ist alles faul, wie Sie es erwarten würden. Wenn Sie keinen Block bereitstellen, gibt es einen kleinen doppelten Code. Ich wünsche mir wirklich, dass Andrew Grimm die Antwort im allgemeinen Fall gilt.

%Vor%

In beiden Fällen zahlen Sie für den Artikelvergleich nicht O(n^2) , wie Sie es im schlimmsten Fall tun würden, wenn Sie eine Array-Subtraktion durchführen.

    
jdsumsion 19.02.2015 06:15
quelle

Tags und Links