Удалить пробелы между одним символом в строке - PullRequest
4 голосов
/ 20 мая 2019

Я пытался удалить повторяющиеся слова из строки в scala.

Я написал udf (код ниже), чтобы удалить повторяющиеся слова из строки:

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

Проблема I 'Я сталкиваюсь с этим в том, что он также удаляет из строки одиночные символьные токены,

Например, если строка была:

"test abc abc 123 foo bar f f f"

Вывод, который я получаю:

"test abc 123 foo bar f"

То, что я хочу сделать, так это удалить только повторяющиеся слова, а не одиночные символы. Один из обходных путей, о котором я мог подумать, - это заменить пробелы между любыми одиночными символьными токенами в строке так, чтобы пример входной строки стал:

"test abc abc 123 foo bar fff"  

, которая решит мою проблему, я не могу понять правильный шаблон регулярных выражений, но я верю, что это можно сделать с помощью группы захвата или прогнозирования.Я смотрел на подобные вопросы для других языков, но не смог выяснить шаблон регулярных выражений в scala.

Любая помощь по этому вопросу будет принята с благодарностью!

Ответы [ 2 ]

5 голосов
/ 20 мая 2019

Если вы хотите удалить пробелы между одним символом во входной строке, вы можете просто использовать следующее регулярное выражение:

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$|$) будет соответствовать пробелам, которые окружены одним символом слова (с пробелом перед ним после него или началом / концом якоря строки) через закрывающие положительные 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
2 голосов
/ 20 мая 2019

Вы можете использовать это регулярное выражение для нацеливания дублирующих слов, присутствующих в строке длиной два или более символов, и заменить их пустой строкой, чтобы сохранить только уникальные слова,

\b(\w{2,})\b\s*(?=.*\1)

Объяснение:

  • \b(\w{2,})\b - выбирает слово, содержащее не менее двух символов
  • \s* - этот дополнительный пробел используется для удаления любого пробела, присутствующего после слова, поэтому ненужный пробел нене лежите
  • (?=.*\1) - этот позитивный взгляд вперед является ключевым здесь для нацеливания дублирующих слов и работает путем выбора слова, если в строке впереди присутствует то же слово

Regex Demo

Scala Code Demo

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|$)

и удалите его с пустой строкой,

Regex Demo

Scala Code,

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
...