【问题标题】:Removing diacritics in Scala在 Scala 中删除变音符号
【发布时间】:2013-08-04 22:36:51
【问题描述】:

问题很简单,在某些语言中使用字符串删除变音符号。例如,使用“téléphone”会产生结果“telephone”。

在Java中我可以使用这样的方法:

 public static String removeAccents(String str){
    return Normalizer.normalize(str, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
}

它工作正常,但在 scala 中却不行……我尝试了如下代码:

val str = Normalizer.normalize("téléphone",Normalizer.Form.NFD)
val exp = "\\p{InCombiningDiacriticalMarks}+".r
exp.replaceAllIn(str,"")

它不起作用!

我想,我在 Scala 中使用 Regex 时遗漏了一些东西,因此我们将不胜感激。

【问题讨论】:

  • 两者对我来说似乎都很好。只是从您的代码中猜测,也许您期望replaceAllIn 将修改您的str。这不会发生,因为 Java/Scala 中的字符串是不可变的。
  • @ghik 不,我没想到会这样,但我用 scala 得到的结果是:
  • @ghik Initialy 我在 Win8 平台上测试了这段代码,但它不起作用。现在我在Ubuntu上试了一下,效果很好,请问是什么原因?
  • @arussinov:检查两个操作系统中的源文件编码。在 Ubuntu 中它将是 utf8,在 Win8 中 - ?.

标签: regex scala


【解决方案1】:

我在使用 Normalizer 时遇到了同样的问题。从Apache Commons StringUtils 中找到了一个解决方案,以 stripAccents 的形式,从字符串中删除变音符号。

 val str = stripAccents("téléphone")
 println(str)

这将产生“电话”。希望这对某人有帮助!

【讨论】:

    【解决方案2】:

    你可以使用这个,创建一个函数来返回stripAccents的值。

    val spark=SparkBase.getSparkSession()
    
    val sc=spark.sparkContext
    import spark.implicits._
    
    val str = stripAccents("téléphone")
    println(str)
    
    val str2 = stripAccents("SERNAQUE ARGÜELLO NORMA ELIZABETH")
    println(str2)
    
    case class Fruits(name: String, quantity: Int)
    val sourceDS = Seq(("YÁBAR ARRIETA JENSON", 1), ("SERNAQUE ARGÜELLO NORMA ELIZABETH", 2)).toDF("text","num")
    
    val check = udf((colValue: String) => {
      stripAccents(colValue)
    })
    
    sourceDS.select(col("text"),check(col("text"))).show(false)
    

    ->输出

    +---------------------------------+---------------------------------+
    |text                             |UDF(text)                        |
    +---------------------------------+---------------------------------+
    |YÁBAR ARRIETA JENSON             |YABAR ARRIETA JENSON             |
    |SERNAQUE ARGÜELLO NORMA ELIZABETH|SERNAQUE ARGUELLO NORMA ELIZABETH|
    +---------------------------------+---------------------------------+
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-03
      • 2011-09-28
      • 2011-04-07
      • 1970-01-01
      • 2020-11-03
      • 1970-01-01
      相关资源
      最近更新 更多