Scala replaceВсе не работает правильно? - PullRequest
0 голосов
/ 15 апреля 2020

В этом контексте я работаю с Scala версией 2.12.10 . Со следующим регулярным выражением

val regex = ",,".r

я вызываю replaceAllIn для данной строки str. Цель состоит в том, чтобы вставить пробел между двумя запятыми.

val str = "a,b,,,,,,c,,d,e,,f"

val newstr = regex.replaceAllIn(str,", ,")

Результат неожиданный:

newstr: String = a,b, ,, ,, ,c, ,d,e, ,f 

Я бы предпочел:

newstr: String = a,b, , , , , ,c, ,d,e, ,f

Только запустить тот же replaceAllIn во второй раз с newstr как ввод дает ожидаемый результат. Это может быть ошибка?

1 Ответ

4 голосов
/ 15 апреля 2020

do c в https://www.scala-lang.org/api/current/scala/util/matching/Regex.html#findAllIn (источник: CharSequence): scala .util.matching.Regex.MatchIterator объясняет:

Для возврата перекрывающихся совпадений , можно сформулировать регулярное выражение с помощью lookahead (? =), которое не использует перекрывающуюся область.

scala> val r = ",,".r
r: scala.util.matching.Regex = ,,

scala> val str = "a,b,,,,,,c,,d,e,,f"
str: String = a,b,,,,,,c,,d,e,,f

scala> val newstr = r.replaceAllIn(str,", ,")
newstr: String = a,b, ,, ,, ,c, ,d,e, ,f

scala> val r = "(,)(?=(,))".r
r: scala.util.matching.Regex = (,)(?=(,))

scala> val newstr = r.replaceAllIn(str,", ,")
newstr: String = a,b, ,, ,, ,, ,, ,,c, ,,d,e, ,,f

scala> val newstr = r.replaceAllIn(str,", ")
newstr: String = a,b, , , , , ,c, ,d,e, ,f
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...