在Scala中的一系列单词之后删除字符串中的所有文本

时间:2016-11-14 15:14:01

标签: regex scala

我正在尝试在Scala中组装一个UDF,它从数据框中获取一列并对其进行操作以删除HTML和其他无用的文本。

我需要修改的列非常混乱,有时候有HTML,有时候没有...搜索我找到remove HTML的正则表达式解决方案

我现在想要完成的是找到一个可以在文本中找到特定单词的正则表达式并删除该单词后面的所有文本。

我想我从this SO answer了解到正则表达式应该类似于\).*,如果您要删除)之后的所有内容,那么我正在尝试将此修改为我的情况,但未成功由于我对正则表达式缺乏了解。

我有像:

这样的字符串
I am interested to hear from you, thanks   Sent from iPhone   other stuff I want to delete....

我希望将字符串的第一部分保留到"发送自"被排除在外,所以完美的输出将是:

I am interested to hear from you, thanks

到目前为止我所拥有的是:

 val toStringNoHTML = udf[String, String](_.toString
    // code from SO as linked above
    .replaceAll("""<(?!\/?a(?=>|\s.*>))\/?.*?>""", " ")
    // delete all text after key word
    .replaceAll("""'Sent from'.*""", "")
    // remove all punctuation
    .replaceAll("""[\p{Punct}\n]""", " ")
    )

当HTML被删除时,&#34;发送自&#34;以及之后的所有文字都没有。任何提示如何调整正则表达式以使其工作?

修改 正如评论中指出的那样,一个小小的拼写错误阻止了我的代码工作,谢谢你的帮助:

.replaceAll("""'Sent from'.*""", "")

应该是

.replaceAll("""Sent from.*""", "")

1 个答案:

答案 0 :(得分:0)

而不是做多个replaceAll(pattern, blank),我很想开始提取。

val msgRE = "(.*>)?(.*)Sent from.*".r

val result = udfStr match {
  case msgRE(_, msg) => Some(msg.trim) // .replaceAll() can be added here
  case _ => None
}

这里的结果是Option[String],但这实际上取决于你想要如何处理不匹配的输入。

如果在提取后需要更多清洁,则可以在指定的地方添加replaceAll()(或者可以更好地提炼提取模式)。