2017-07-03 10 views
0

Scalaの使用thisの質問に従ってデータからURLを削除しようとしています。 ScalaでfilterNotの正規表現変数を使用するにはどうすればよいですか?

 val urls = """(https?\\://)\\S+""" 
     val removeRegexUDF = udf(
     (input: Seq[String]) => input.filterNot(s => s.matches(urls)) 

が、これは、データには影響を与えないように見える:

val removeRegexUDF = udf(
    (input: Seq[String]) => input.filterNot(s => s.matches("(https?\\://)\\S+")) 

filteredDF.withColumn("noURL", removeRegexUDF('filtered)).select("racist", "filtered","noURL").show(100, false) 

は、今私は、変数の代わりに、正規表現リテラルを使用したいので、私は試してみてください。そして、次のコードは正常に動作します。私が試してみてください。

val urls = """(https?\\://)\\S+""".r 

が、これはエラーを与える:

urls: scala.util.matching.Regex = (https?\\://)\\S+ 
<console>:45: error: type mismatch; 
found : scala.util.matching.Regex 
required: String 
     (input: Seq[String]) => input.filterNot(s => s.matches(urls)) 

これを達成するための方法上の任意の案内がはるかに高く評価されます。

+1

二重バックスラッシュまたは三重引用符を使用してください。元のコードでは二重バックスラッシュを使用しています。なぜ、 'val urls'に三重引用符を追加したのですか? – Kolmar

答えて

1

私は、一重引用符と三重引用符の使用と関係があると思います。最初の例では文字をエスケープするためにバックスラッシュを追加しますが、後者の場合は不要です。トリプルクォートで文字列をラップするだけで十分です。

println("(https?\\://)\\S+")  // (https?\://)\S+ 
println("""(https?\\://)\\S+""") // (https?\\://)\\S+ 
println("""(https?\://)\S+""") // (https?\://)\S+ 
+0

だから簡単!ありがとう。 – schoon

+0

私はそれが助けてうれしいです:) –

関連する問題