Konvertieren Sie eine Zeichenfolge in Ruby mit regulären Ausdrücken

117

Ich muss Zeichenfolgen wie "/ [\ w \ s] + /" in reguläre Ausdrücke konvertieren.

"/[\w\s]+/" => /[\w\s]+/

Ich habe versucht, verschiedene RegexpMethoden wie:

Regexp.new("/[\w\s]+/") => /\/[w ]+\//ähnlich Regexp.compileund Regexp.escape. Aber keiner von ihnen kehrt zurück, wie ich erwartet hatte.

Außerdem habe ich versucht, Backslashes zu entfernen:

Regexp.new("[\w\s]+") => /[w ]+/ Aber kein Glück.

Dann habe ich versucht, es einfach zu machen:

str = "[\w\s]+"
=> "[w ]+"

Es entkommt. Wie kann nun die Zeichenfolge unverändert bleiben und in ein reguläres Ausdrucksobjekt konvertiert werden?

cmthakur
quelle

Antworten:

148

Hier muss die Anfangszeichenfolge in einfachen Anführungszeichen stehen (siehe diese Seite ).

>> str = '[\w\s]+'
 => "[\\w\\s]+" 
>> Regexp.new str
 => /[\w\s]+/ 
Alony
quelle
137

Deutlich sein

  /#{Regexp.quote(your_string_variable)}/

funktioniert auch

edit: hat deine_string_variable aus Gründen der Richtigkeit in Regexp.quote eingeschlossen.

Sergey Gerasimov
quelle
3
Ich habe gerade herausgefunden, dass Sie Optionen auf diese Weise nicht anhängen können /#{your_regex}/#{options}.
Pduersteler
Ich nehme an, Sie sprechen von Rails? optionsist ein Hash und Ruby ist nicht soooo dynamisch =)
Sergey Gerasimov
2
Dies macht nicht das, was OP in Ruby 2.1 verlangt, es konvertiert "[\ w \ s] +" => / [w] + /
Luca Spiller
1
Bitte beachten Sie, dass die Antwort im Jahr 2012 gegeben wurde :) Zu dieser Zeit war alles perfekt
Sergey Gerasimov
4
Es war ein perfektes Jahr.
Naftuli Kay
35

Diese Methode entgeht sicher allen Zeichen mit besonderer Bedeutung:

/#{Regexp.quote(your_string)}/

Zum Beispiel .wird entkommen, da sie als ‚jedes Zeichen‘ anders interpretiert wird .

Denken Sie daran, eine Zeichenfolge in einfachen Anführungszeichen zu verwenden, es sei denn, Sie möchten, dass die reguläre Zeichenfolgeninterpolation aktiviert wird, wobei Backslash eine besondere Bedeutung hat.

Sandstrom
quelle
2
Schön, weil es erklärt, wie wir die Zeichenfolgenvariable schützen können, die Zeichen (wie z. B. +.) enthalten kann, die im Regexp interpretiert werden.
Rchampourlier
1
Dies macht nicht das, was OP in Ruby 2.1 verlangt, es konvertiert "[\ w \ s] +" => / [w \] \ + /
Luca Spiller
@LucaSpiller Sie müssen eine Zeichenfolge in einfachen Anführungszeichen verwenden. Backslash wird in Zeichenfolgen in doppelten Anführungszeichen als Sonderzeichen behandelt, weshalb z. B. "\n"eine neue Zeile '\n'ist, dies jedoch nicht ist.
Sandstrom
8

% Notation verwenden:

%r{\w+}m => /\w+/m

oder

regex_string = '\W+'
%r[#{regex_string}]

Von der Hilfe :

% r [] Interpolierter Regexp (Flags können nach dem schließenden Trennzeichen erscheinen)

BitOfUniverse
quelle
Dies macht nicht das, was OP in Ruby 2.1 verlangt, es konvertiert "[\ w \ s] +" => / [ws] + /
Luca Spiller
1
@ Luca Spiller, danke, dort sollten einfache Anführungszeichen verwendet werden, ich werde die Antwort aktualisieren.
BitOfUniverse
5

Das Juwel to_regexp kann die Arbeit erledigen.

"/[\w\s]+/".to_regexp => /[\w\s]+/

Sie können auch den Modifikator verwenden:

'/foo/i'.to_regexp => /foo/i

Schließlich können Sie fauler sein mit: erkennen

'foo'.to_regexp(detect: true)     #=> /foo/
'foo\b'.to_regexp(detect: true)   #=> %r{foo\\b}
'/foo\b/'.to_regexp(detect: true) #=> %r{foo\b}
'foo\b/'.to_regexp(detect: true)  #=> %r{foo\\b/}
Ryan
quelle