我试图从Scala中的字符串中删除重复的单词。
我写了一个UDF(下面的代码(以从字符串中删除重复的单词:
val de_duplicate: UserDefinedFunction = udf ((value: String) => {
if(value == "" | value == null){""}
else {value.split("\s+").distinct.mkString(" ")}
})
我面临的问题是它也正在从字符串中删除单个字符令牌,
例如字符串是:
"test abc abc 123 foo bar f f f"
我得到的输出是:
"test abc 123 foo bar f"
我想做的仅删除仅删除重复单词而不是单个字符,我能想到的一个解决方法是替换字符串中任何单个字符令牌之间的空间,以便示例输入字符串成为:
"test abc abc 123 foo bar fff"
这可以解决我的问题,我无法弄清楚正确的正则表达式模式,但我相信可以使用捕获组或观察来完成。我查看了其他语言的类似问题,但无法弄清楚Scala中的Regex模式。
对此的任何帮助将不胜感激!
如果要在输入字符串中的单个字符之间删除空格,则只需使用以下正则:
println("test abc abc 123 foo bar f f f".replaceAll("(?<= \w|^\w|^) (?=\w |\w$|$)", ""));
输出:
test abc abc 123 foo bar fff
demo :https://regex101.com/r/tekkep/1
说明:
the Regex:(?<= w|^w|^) (?=w |w$|$)
将通过正面的LookAhead/lookBehind关闭,匹配一个单词字符(最终在其之前的空间或线锚的开始/结束(包围的空间。
更多输入:
test abc abc 123 foo bar f f f
f boo
f boo
boo f
boo f f
too f
关联的输出:
test abc abc 123 foo bar fff
f boo
f boo
boo f
boo ff
too f
您可以使用此regex来定位具有两个或多个字符的字符串中存在的重复单词,然后用空字符串替换它们以仅保留唯一的单词,
b(w{2,})bs*(?=.*1)
说明:
-
b(w{2,})b
-选择一个至少两个字符的单词 -
s*
-此可选的空间有删除单词后存在的任何空间,因此不需要的空间不在那里 -
(?=.*1)
-未来的正面外观是针对重复单词的关键,并通过选择一个单词来起作用,如果字符串中存在相同的单词
REGEX DEMO
Scala代码演示
object Rextester extends App {
val s = "abc test abc abc 123 foo bar foo f sd foo f f abc"
println("Unique words only: " + s.replaceAll("\b(\w{2,})\b\s*(?=.*\1)",""))
}
仅输出唯一的单词,
Unique words only: test 123 bar f sd foo f f abc
编辑:
删除重复的单词不是您想要的,而您只想在单个字符单词之间删除一个或多个空间,您可以使用此正则是
(?<=^|bw) +(?=wb|$)
并用空字符串
将其删除REGEX DEMO
Scala代码,
val s = "test abc abc 123 foo bar f f f"
println("Val: " + s.replaceAll("(?<=^|\b\w) +(?=\w\b|$)",""))
输出,
Val: test abc abc 123 foo bar fff