2017-07-20 3 views
1

"&ハローバディ"と "& endmarker &"を含む行を削除する予定です。下記に示されており、任意の助けを動作しないように私はでReplaceAllを使用plsは...Scalaは正規表現で2つのマーカー間の文字列を削除します

val s1 = 
    """ 
    |& Hello Buddy 
    |------------------------------ 
    |Hello; 
    |GO 
    |My 
    |use &endmarker& 
    | GO 
    |World 
    |go 
    |, I am Naga 
    |+++++++++++++++++++++++++ 
    |GOTO School 
    |GO Heaven 
    """ 


val rg =s1.replaceAll("(?m)&(.*)&endmarker&" ," ") 

答えて

1

私は

val rg =s1.stripMargin('|').replaceAll("(?s)& Hello Buddy(.*?)&endmarker&" ," ").trim() 

出力勧め:

GO 
World 
go 
, I am Naga 
+++++++++++++++++++++++++ 
GOTO School 
GO Heaven 

Scala demo

を参照してください。 .stripMargin('|')はインデントを取り除きます。

パターンは

  • (?s)詳細 - DOTALL修飾子は、.は、改行文字を含む任意の文字に一致し
  • & Hello Buddy - 文字列リテラル
  • .*? - アップできるだけ少ないとして任意の0+文字...
  • &endmarker& - リテラル文字列。

あなたが処理するために、大きなファイルを持っている場合は、パターンが.*?怠惰なドットが一致しアンロール・ループパターン[^&]*(?:&(?!endmarker&)[^&]*)*に置き換えられ

"(?s)& Hello Buddy[^&]*(?:&(?!endmarker&)[^&]*)*&endmarker&" 

としてパフォーマンスを向上させるために再記述する必要がありますZ -

  • [^&]*から&
  • (?:&(?!endmarker&)[^&]*)*以外0+文字EROまたはそれ以上の出現:
    • &(?!endmarker&)から&endmarker&
    • [^&]*と続かない - 0+ &
以外の文字
関連する問題