删除字符串中单个字符之间的空格

Vai*_*av 4 regex scala regex-group apache-spark

我试图从Scala中的字符串中删除重复的单词。

我写了一个udf(下面的代码)从字符串中删除重复的单词:

val de_duplicate: UserDefinedFunction = udf ((value: String) => {
if(value == "" | value == null){""}
else {value.split("\\s+").distinct.mkString(" ")}
})
Run Code Online (Sandbox Code Playgroud)

我面临的问题是它也从字符串中删除了单个字符标记,

例如,如果字符串是:

"test abc abc 123 foo bar f f f"
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

"test abc 123 foo bar f"
Run Code Online (Sandbox Code Playgroud)

我要做的是仅删除重复的单词,而不删除单个字符。我可以想到的一种解决方法是替换字符串中任何单个字符标记之间的空格,以使示例输入字符串变为:

"test abc abc 123 foo bar fff"  
Run Code Online (Sandbox Code Playgroud)

这可以解决我的问题,我无法找出正确的正则表达式模式,但我相信可以使用捕获组或提前完成。我在其他语言中也看过类似的问题,但无法弄清楚scala中的正则表达式模式。

任何帮助,将不胜感激!

All*_*lan 5

如果要删除输入字符串中单个字符之间的空格,则可以使用以下正则表达式:

println("test abc abc 123 foo bar f f f".replaceAll("(?<= \\w|^\\w|^) (?=\\w |\\w$|$)", ""));
Run Code Online (Sandbox Code Playgroud)

输出:

test abc abc 123 foo bar fff
Run Code Online (Sandbox Code Playgroud)

演示https : //regex101.com/r/tEKkeP/1

说明:

正则表达式:(?<= \w|^\w|^) (?=\w |\w$|$)将通过正向先行/后向闭合来匹配由一个单词字符包围的空格(最终在其后有空格,或行锚的开始/结尾)。

更多输入:

test abc abc 123 foo bar f f f
f boo
 f boo
boo f
boo f f
too f 
Run Code Online (Sandbox Code Playgroud)

相关输出:

test abc abc 123 foo bar fff
f boo
f boo
boo f
boo ff
too f
Run Code Online (Sandbox Code Playgroud)