如何解决如何在 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 举报,一经查实,本站将立刻删除。