微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Scala 中用另一个特殊字符替换第 n 次出现,例如管道分隔符?

如何解决如何在 Scala 中用另一个特殊字符替换第 n 次出现,例如管道分隔符?

我是使用 Scala 的 Spark 新手,我需要用换行符替换第 n 次出现的分隔符。

到目前为止,我已经成功地在管道分隔符之后输入了一个新行。 我无法替换分隔符本身。

我的输入字符串是

val txt = "January|February|march|April|May|June|July|August|September|October|November|December"

println(txt.replaceAll(".\\|","$0\n"))

以上语句生成以下输出

January|
February|
march|
April|
May|
June|
July|
August|
September|
October|
November|
December

我参考了 https://salesforce.stackexchange.com/questions/189923/adding-comma-separator-for-every-nth-character 处的建议,但是当我在花括号中输入数字时,我最终只在分隔符后 after 2 个字符后添加了换行符。

我希望我的输出如下所示。

January|February
march|April
May|June
July|August
September|October
November|December

如何更改正则表达式以获得所需的输出

更新: 我的朋友建议我试试下面的语句

println(txt.replaceAll("(.*?\\|){2}","$0\n"))

这产生了以下输出

January|February|
march|April|
May|June|
July|August|
September|October|
November|December

现在我只需要去掉每行末尾的管道符号。

解决方法

您想将第 2 个栏 | 移到捕获组之外。

txt.replaceAll("([^|]+\\|[^|]+)\\|","$1\n")
//val res0: String =
//  January|February
//  March|April
//  May|June
//  July|August
//  September|October
//  November|December

正则表达式解释(正则表达式不是 Scala)

  • ( - 开始捕获组
  • [^|] - 任何字符,只要不是横杠 | 字符
  • [^|]+ - 1 个或多个(任何)非条形字符
  • \\| - 后跟单个条形字符 |
  • [^|]+ - 后跟 1 个或多个任何非条形字符
  • ) - 关闭捕获组
  • \\| - 后跟单个条形字符(不在捕获组中)
  • "$1\n" - 仅用第一个 $1 捕获组($0 是整个匹配字符串)后跟换行符替换整个匹配字符串

更新

对于 N 次重复的一般情况,正则表达式会变得有点麻烦,至少如果您尝试使用单个正则表达式公式。

最简单的方法(不是最有效但编码简单)是遍历 String 两次。

val n = 5
txt.replaceAll(s"(\\w+\\|){$n}","$0\n")
   .replaceAll("\\|\n","\n")
//val res0: String =
//  January|February|March|April|May
//  June|July|August|September|October
//  November|December
,

您可以先使用“|”分割字符串获取字符串数组,然后循环遍历它以执行所需的逻辑并根据需要获取输出。

val txt = "January|February|March|April|May|June|July|August|September|October|November|December"
val out = txt.split("\\|")
var output: String = ""
for(i<-0 until out.length -1 by 2){
  val ref = out(i) + "|" + out(i+1) + "\n"
  output = output + ref
}
val finalout = output.replaceAll("\"\"","")  //just to remove the starting double quote
println(finalout)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。