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

6

我试图在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中找出正则表达式模式。

如果有任何帮助,将不胜感激!

2个回答

7

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

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

输出:

test abc abc 123 foo bar fff

演示: 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 

相关输出:

test abc abc 123 foo bar fff
f boo
f boo
boo f
boo ff
too f

2
您可以使用此正则表达式来定位字符串中存在的长度为两个或更多字符的重复单词,并用空字符串替换它们,以保留唯一的单词。
\b(\w{2,})\b\s*(?=.*\1)

解释:
  • \b(\w{2,})\b - 选择至少有两个字符的单词
  • \s* - 这个可选的空格用于删除单词后面的任何空格,以便不需要的空格不会留在那里
  • (?=.*\1) - 这个正向先行是这里定位重复单词的关键,它通过选择一个单词来工作,如果同样的单词在字符串中出现在前面,则选择该单词

正则表达式演示

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

编辑: 由于删除重复单词并不是您想要的,而您只想删除单个字符单词之间的一个或多个空格,因此您可以使用以下正则表达式:
(?<=^|\b\w) +(?=\w\b|$)

用空字符串删除它,
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

请问您能否解释一下这个语法? - Vaibhav
即使重复的单词不是连续出现的,比如“foo bar foo bar”,这个正则表达式是否也会起作用,返回结果为“foo bar”? - Vaibhav
你可以在我的回答中包含的regex101演示链接中操作字符串。 - Pushpesh Kumar Rajwanshi
感谢您的回答,它确实删除了单词的重复实例,但是我已经接受了另一个答案,因为上面的正则表达式会保留重复单词的最后一个实例,这会修改原始字符串中单词出现的顺序,而我想要保持原始顺序,另一个答案中的正则表达式可以做到。 - Vaibhav
1
@Vaibhav: 我不知道你是否想保留顺序,而且另一个答案根本没有删除重复单词。如果我知道你只想删除单个字符单词之间的空格,我会给你提供比其他答案更简单的正则表达式。您可以使用此正则表达式(?<=^|\b\w) +(?=\w\b|$),它还处理了单词之间存在多个空格的情况。 - Pushpesh Kumar Rajwanshi
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接