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?

Antworten:


148

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

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

137

Deutlich sein

  /#{Regexp.quote(your_string_variable)}/

funktioniert auch

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


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.


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)


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/}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.