2012-11-11 4 views
11

Ruby Regexp hat einige Optionen (z. B. i, x, m, o). i bedeutet zum Beispiel ignorieren Fall.Was bedeutet der o-Modifikator für eine Regexp?

Was bedeutet die Option o? In ri Regexp heißt es o bedeutet #{} Interpolation nur einmal durchzuführen. Aber wenn ich dies tun:

a = 'one' 
b = /#{a}/ 
a = 'two' 

b ändert sich nicht (es bleibt /one/). Was vermisse ich?

+0

Sie verwenden nicht das 'o'-Flag in Ihrer Regexp. Warum erwartest du irgendeinen Effekt davon? – sawa

+0

Nun, wenn 'o' Flag zu verwenden bedeutet, den Effekt einzuschalten, dann kann ich das '# {}' in einem Regexp jedes Mal ohne das Flag ausführen –

+0

Vorsicht, dass in der Perl (im Gegensatz zu Ruby) docs http: // perldoc.perl.org/perlre.html es wird vom "o" -Modifikator angegeben: "tue so, als ob du deinen Code optimierst, aber führe Bugs ein". In Perl scheint die "o" -Flagge eine andere Bedeutung zu haben als die von Ruby, und außerdem kann die Perl-Flagge gebrochen sein. – Rhubbarb

Antwort

19

Gerade von the go-to source for regular expressions:

/o verursacht keine #{...} Substitutionen in einer bestimmten Regex wörtlichen nur einmal durchgeführt werden, das erste Mal ausgewertet. Andernfalls werden die Ersetzungen jedes Mal ausgeführt, wenn das Literal ein Regexp-Objekt generiert.

Ich könnte auch this usage example auftauchen:

# avoid interpolating patterns like this if the pattern 
# isn't going to change: 
pattern = ARGV.shift 
ARGF.each do |line| 
    print line if line =~ /#{pattern}/ 
end 

# the above creates a new regex each iteration. Instead, 
# use the /o modifier so the regex is compiled only once 

pattern = ARGV.shift 
ARGF.each do |line| 
    print line if line =~ /#{pattern}/o 
end 

Also ich denke, das ist eher eine Sache für den Compiler, für eine einzelne Linie, die mehrfach ausgeführt wird.

+1

Gerade vor einer Sekunde las ich ein Wiki über 'Evaluierungsstrategie', ich verstehe endlich viel. In Ruby wird die eifrige Auswertung durchgeführt, also nach dem Segment 'b =/# {a} /', 'b' wird'/one/'zugewiesen, das heißt," es gibt nichts mit dem 'o' zu tun flag ' –

+0

Diese Antwort wurde zu der [Häufig gestellten Fragen zum häufigen Überfüllen von Regulärausdrücken] (http://stackoverflow.com/a/22944075/2736496) unter "Modifikatoren" hinzugefügt. – aliteralmind