web-dev-qa-db-ja.com

Scalaでの文字列のトリミング

Scalaで文字列の開始文字と終了文字をトリミングする方法

",hello""hello,"などの入力の場合、"hello"としての出力が必要です。

Scalaでこれを行う組み込みメソッドはありますか?

33
yAsH

試して

val str = "  foo  "
str.trim

ドキュメント をご覧ください。 ,文字も取り除く必要がある場合は、次のようなものを試すことができます。

str.stripPrefix(",").stripSuffix(",").trim

文字列のフロントエンドをクリーンアップする別の方法は

val ignoreable = ", \t\r\n"
str.dropWhile(c => ignorable.indexOf(c) >= 0)

",,, ,,hello"などの文字列も処理します

そして、良い測定のために、ここに小さな関数があります。これは、文字列を左から右に1回スイープするだけです。

def stripAll(s: String, bad: String): String = {

    @scala.annotation.tailrec def start(n: Int): String = 
        if (n == s.length) ""
        else if (bad.indexOf(s.charAt(n)) < 0) end(n, s.length)
        else start(1 + n)

    @scala.annotation.tailrec def end(a: Int, n: Int): String =
        if (n <= a) s.substring(a, n)
        else if (bad.indexOf(s.charAt(n - 1)) < 0) s.substring(a, n)
        else end(a, n - 1)

   start(0)
}

のように使用する

stripAll(stringToCleanUp, charactersToRemove)

例えば。、

stripAll("  , , , hello , ,,,, ", " ,") => "hello"
78
Dirk

文字列の開始文字と終了文字をトリミングするには、dropとdropRightを組み合わせて使用​​します。

scala> "hello、"。drop(1).dropRight(1)

res4:文字列=こんにちは

ドロップ呼び出しは最初の文字を削除し、dropRightは最後の文字を削除します。これは、トリムのような「スマート」ではないことに注意してください。 「hello」の先頭に余分な文字がない場合は、「Ello」にトリミングします。もっと複雑なものが必要な場合は、おそらく正規表現の置換が答えです。

11
lreeder

コンマのみをトリムし、両端に複数ある場合は、これを行うことができます。

str.dropWhile(_ == ',').reverse.dropWhile(_ == ',').reverse

ここでreverseを使用するのは、dropRightWhileがないためです。

考えられる単一のコンマを見ている場合、Dirkが示すように、stripPrefixstripSuffixが道です。

prefixおよびsuffix指定された文字列(文字列全体をスキャンしない)の場合、目的の効果をすばやく実行する小さなtrimPrefixSuffixChars関数を次に示します。

def trimPrefixSuffixChars(
    string: String
  , invalidCharsFunction: (Char) => Boolean = (c) => c == ' '
): String =
  if (string.nonEmpty)
    string
      .dropWhile(char => invalidCharsFunction(char))  //trim prefix
      .reverse
      .dropWhile(char => invalidCharsFunction(char)) //trim suffix
      .reverse
  else
    string

この関数は、スペース文字( "")のみを無効として定義するinvalidCharsFunctionのデフォルトを提供します。次の入力文字列の変換は次のようになります。

trimPrefixSuffixChars(" Tx  ")     //returns "Tx"
trimPrefixSuffixChars(" . Tx . ")  //returns ". Tx ."
trimPrefixSuffixChars(" T x  ")    //returns "T x"
trimPrefixSuffixChars(" . T x . ") //returns ". T x ."

独自のinvalidCharsFunction関数を指定したい場合は、次のように呼び出しで渡します。

trimPrefixSuffixChars(",Tx. ", (c) => !c.isLetterOrDigit)     //returns "Tx"
trimPrefixSuffixChars(" ! Tx # ", (c) => !c.isLetterOrDigit)  //returns "Tx"
trimPrefixSuffixChars(",T x. ", (c) => !c.isLetterOrDigit)    //returns "T x"
trimPrefixSuffixChars(" ! T x # ", (c) => !c.isLetterOrDigit) //returns "T x"

これは、他の回答で提供される多くのソリューション例の簡素化を試みます。

1

誰かが正規表現バージョンを要求しました。これは次のようなものです。

val trim: Regex = raw"[,\s]*(|.*[^,\s])[,\s]*".r

val result = " , ,, hello, ,," match { case trim(x) => x }

結果:result: String = hello

正規表現の欠点は(この場合だけでなく、常に)、構文にまだ詳しくない人にとっては読みにくいことです。ただし、コードはすてきで簡潔です。

0
Pianosaurus