Scalaで文字列の開始文字と終了文字をトリミングする方法
",hello"
や"hello,"
などの入力の場合、"hello"
としての出力が必要です。
Scalaでこれを行う組み込みメソッドはありますか?
試して
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"
文字列の開始文字と終了文字をトリミングするには、dropとdropRightを組み合わせて使用します。
scala> "hello、"。drop(1).dropRight(1)
res4:文字列=こんにちは
ドロップ呼び出しは最初の文字を削除し、dropRightは最後の文字を削除します。これは、トリムのような「スマート」ではないことに注意してください。 「hello」の先頭に余分な文字がない場合は、「Ello」にトリミングします。もっと複雑なものが必要な場合は、おそらく正規表現の置換が答えです。
コンマのみをトリムし、両端に複数ある場合は、これを行うことができます。
str.dropWhile(_ == ',').reverse.dropWhile(_ == ',').reverse
ここでreverse
を使用するのは、dropRightWhile
がないためです。
考えられる単一のコンマを見ている場合、Dirkが示すように、stripPrefix
とstripSuffix
が道です。
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"
これは、他の回答で提供される多くのソリューション例の簡素化を試みます。
誰かが正規表現バージョンを要求しました。これは次のようなものです。
val trim: Regex = raw"[,\s]*(|.*[^,\s])[,\s]*".r
val result = " , ,, hello, ,," match { case trim(x) => x }
結果:result: String = hello
正規表現の欠点は(この場合だけでなく、常に)、構文にまだ詳しくない人にとっては読みにくいことです。ただし、コードはすてきで簡潔です。