2011-11-15 15 views
8

私はRubyで単純な文字列subをやろうとしています。正規表現を持たないRuby文字列の参照

sub()の第2引数は、正規表現が含まれている長いJavaScriptの断片です。置換された文字列(つまり、最初の引数)が出力文字列に現れるため、この文字列の正規表現内の後方参照はsubの結果に影響しているようです。

例:

"string \& is here" 

ない:

"string & is here" 

または正規表現

"string <!--tooreplace--> is here" 
を逃れるかの

input = "string <!--tooreplace--> is here" 
output = input.sub("<!--tooreplace-->", "\&") 

私は出力になりたいです

基本的には、正規表現の結果をまったく持たない文字列サブを行う方法がほしいです。単純な文字列を置き換えます。

+0

問題を示す小さな例を作成できますか? –

+0

サンプルコードが追加されました。 –

答えて

2

使用単一引用符やバックスラッシュエスケープ:Regex.escapeを使用し、置換文字列をエスケープする方法を見つけ出すことを避けるために

output = input.sub("<!--tooreplace-->", '\\\&') #=> "string \\& is here" 
6

を。置換えが複雑な場合や、それを処理することが不要な場合は便利です。 Stringの小さなヘルパーも素晴らしいです。

=> puts input.sub("<!--tooreplace-->") {'\&'} 
string \& is here 
+2

これは例を修正しますが、他の場所で問題を引き起こすようです。たとえば、2番目の引数を '\&O =/\ s *([\ s \ + \〜>])\ s */g'に変更すると、 'string \&、O =/\ \ * \(\ [\ s \\〜> \] \)\ s \ */gは余分なものがエスケープされています。 –

3

特別な正規表現では、バックスラッシュをエスケープする必要があるという理由があります。実際には、これは動作します:

>> puts 'abc'.sub 'b', '\\\\&' 
a\&c 

注意を\\\\&は、文字列リテラル\\&を表していること。

+0

非常に有益です。特に、エスケープは単なるオプションではない、他の用途(例えば、ファイルを読み込み、ファイルの内容を置換の文字列として使用するなど)に適用されるためです。 –

0

まあ、'\\&'ので、(つまり、&続い\ですが)として解釈されている:あなたはまた、(Regexp.escapeではなく)、それを簡単にするためにブロックの表記を使用することができます

input.sub("<!--toreplace-->", Regexp.escape('\&'))