2016-11-28 5 views
3

に2つの特定の文字の間に部分文字列を削除するにはどのように私はScalaでこのリストを持っていますと]を取り除いて|削除されました。Scalaの

だから、結果は次のようになります。

List[String] = List([[aaa]], [[ccc]], [[ooo]]) 

私は何か一覧で列を作り、でReplaceAllを使用してみましたが、私はリストを節約したいです。

ありがとうございました。

答えて

3

正規表現\|.*?]]を使用すると、削除する必要がある部分文字列を一致させることができます。ここ

はScalaのコードに置換を実行するための方法である:

val l = List[String]("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]") 
println(l.map(x => x.replaceAll("""\|.*?(]])""", "$1"))) 

Scala demo

を見るIは]]周りキャプチャグループを追加し、]]を挿入する置換パターンに$1後方参照を使用しました結果に戻る。

詳細

  • \| - リテラル| PI [Eシンボル(それは文字クラスのoutide特殊文字であるため、それはエスケープされなければならない)
  • .*? - 任意ゼロ以上改行記号以外の記号
  • (]]) - グループ1キャプチャ]]部分文字列(文字クラス外の]はエスケープする必要はありません。ケースの反対側の|)。
+0

ありがとうございました! – KonaKona

+0

replaceAll( "" \ | [^ \]] + "" "、" ")'の場合、キャプチャグループは必要ありません。また、 '[]'のネストレベルが変更されても正確です。 – jwvh

+0

@jwvh: ']]'と置き換えることができます。正規表現ができることを示す方法です。 –

0

]|}間の3つの文字を置き換えます。

正規表現はここ"\\|(.{3})\\]"|}をエスケープすることを忘れないでください)

scala> val list = List("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]") 
list: List[String] = List([[aaa|bbb]], [[ccc|ddd]], [[ooo|sss]]) 

scala> list.map(_.replaceAll("\\|(.{3})\\]", "]")) 
res16: List[String] = List([[aaa]], [[ccc]], [[ooo]]) 
4

でのパフォーマンスにはかなり良いことがありますシンプルなソリューションです:

val list = List("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]") 
list.map(str => str.takeWhile(_ != '|') + "]]") 

それはの形式ことを前提としてい文字列は次のとおりです。

  • 2つの左角かっこ01最初に、
  • 、次に抽出する単語
  • 、次にパイプ|を入力します。
+1

この回答は短すぎるかもしれません。 MCVEの提供に加えて、あなたのソリューションについて説明できますか? [*どのように私は良い答えを書いていますか?*](http://stackoverflow.com/help/how-to-answer): "...あなたの答えに何らかの制限、仮定、単純化について言及しようとする。完全な説明はより良い」 – gfullam

+1

ok、私はそれを編集するために体重があります – Mikel

+0

清潔で効率的ですが、OPが要求した結果はありません。 – jwvh