2016-11-28 5 views
3

У меня есть этот список в Scala:Как удалить подстроку между двумя конкретными символами в Scala

List[String] = List([[aaa|bbb]], [[ccc|ddd]], [[ooo|sss]]) 

И я хочу, чтобы получить тот же список с подстроки между | и] удалены и | удален тоже.

Так что результат будет:

List[String] = List([[aaa]], [[ccc]], [[ooo]]) 

Я пытался что-то сделать строку со списком и с помощью replaceAll, но я хочу, чтобы сохранить список.

Спасибо.

ответ

3

Вы можете использовать простой \|.*?]] regex, чтобы соответствовать этим подстрокам, которые вам нужно удалить.

Вот способ, чтобы выполнить замену в Scala коде:

val l = List[String]("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]") 
println(l.map(x => x.replaceAll("""\|.*?(]])""", "$1"))) 

ВИДЕТЬ Scala demo

Я добавил захват группы вокруг ]] и использовал $1 обратной ссылки в шаблоне замены для вставки ]] вернемся к результату.

Детали:

  • \| - буквальный | пи [е символ (так как это специальный символ outide класса символов, он должен быть экранирован)
  • .*? - любой ноль или более символы, отличные от символов разрыва строки
  • (]]) - Подгруппа 1 группы ]] (обратите внимание, что ] вне класса символов не требуется экранирование, это просто напротив корпуса с |).
+0

Большое вам спасибо! – KonaKona

+0

Вам не нужна группа захвата, если вы меняетеAll ("" "\ \ [^ \]] +" "", "") ', и она по-прежнему точная, если уровень' [] 'nesting изменяется. – jwvh

+0

@jwvh: Я знаю, что могу заменить на ']]'. Это просто способ показать, что может делать регулярное выражение. –

0

Заменить 3-х символов между | и } с ].

регулярное выражение "\\|(.{3})\\]" (не забудьте, чтобы избежать | и })

scala> val list = List("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]") 
list: List[String] = List([[aaa|bbb]], [[ccc|ddd]], [[ooo|sss]]) 

scala> list.map(_.replaceAll("\\|(.{3})\\]", "]")) 
res16: List[String] = List([[aaa]], [[ccc]], [[ooo]]) 
4

Вот простое решение, которое должно быть достаточно хорошо в исполнении:

val list = List("[[aaa|bbb]]", "[[ccc|ddd]]", "[[ooo|sss]]") 
list.map(str => str.takeWhile(_ != '|') + "]]") 

Предполагается, что формат строки:

  • Две левые квадратные скобки [ в начале,
  • затем слово, которое мы хотим извлечь,
  • , а затем труба |.
+1

Этот ответ может быть слишком кратким. В дополнение к предоставлению MCVE вы можете объяснить свое решение? Из [* Как написать хороший ответ? *] (Http://stackoverflow.com/help/how-to-answer): «... попытайтесь упомянуть о любых ограничениях, допущениях или упрощениях в вашем ответе. Брексия приемлема, но более полные объяснения лучше ». – gfullam

+1

ok, я собираюсь отредактировать его – Mikel

+0

Чистый и эффективный, но не тот результат, который запросил ОП. – jwvh