1

ルビーの正規表現の問題、そして何らかの理由で、ルビーのgsubメソッドでこれを1行で必要とします

入力sample文字列変数が以下のような複数行の文字列であるとします

begin1 item abc item abc item 
extra end1
begin2 item abc item abc extra end2
begin1 item abc item abc extra end1

ルールは、itemブロック内の which をすべてbegin1に変更end1するloveことです。複数行にわたる場合があります

置換後、出力sampleは次のようになります

begin1 love abc love abc love 
extra end1
begin2 item abc item abc extra end2
begin1 love abc love abc love end1  

解決策はこのようなものです

puts sample.gsub!(/(begin1.*)item*(.*end1)/m,'\1love\2')
4

2 に答える 2

3

これはどうsample.gsub!(/item(?=((?!begin1).)*end1)/m, 'love')ですか?

そして、正規表現の魔法を少し緩和するには:

/ 
  item              
  (?=               # look-ahead assertion
    (               
      (?!begin1)    # negative look-ahead assertion
      .             # any character that is not part of the 'begin1' sequence
    )*              # there's no 'begin1' after 'item' and before 'end1'
    end1            # there is 'end1' after 'item'
  )
/mx                 # /m - for multiline strings, x - for comments

(「マークアップ」が「正しい」場合にのみ正しく機能することに注意してください。たとえば、末尾または先頭の開始がなく、ネストブロックがありません)

また、正規表現はそのようなタスクには不十分なツールであると言わざるを得ません。複雑な正規表現はあまりにも理解できず、保守も困難です。それらは黒魔術のようなものです - いつクラッシュするかわかりません :)

于 2012-02-02T21:30:06.527 に答える
0

質問の入力部分の意味がよくわからないので、少し混乱していますが、gsubメソッドを間違った方法で使用していると思います。これを試して:

> string = 'begin1 item abc item abc item'
=> "begin1 item abc item abc item"
> string.gsub(/item/, 'love')
=> "begin1 love abc love abc love"

これは単純な正規表現の置換方法です。 使用方法の詳細については、ドキュメントを参照してください。必要以上に複雑にしている可能性があると思います。

于 2012-02-02T16:02:07.033 に答える