регулярное выражение Scala для замены всего, кроме пробелов и указанной цели - PullRequest
0 голосов
/ 01 июня 2018

Мой исходный код, но он принимает все числа независимо от длины.Мне нужно заменить только 5 последовательных чисел, предшествующих одному хешу.

val st="ABC  #12345768 213123 Checks juan #54321 asda"
val Replace= "([^\\s|'(#\\[0-9\\]{5})'])".r
val new_value= Replace.replaceAllIn(st, "X")
println(new_value)

Ожидаемый результат:

XXX  XXXXXXXXX XXXXXX XXXXXX XXXX #54321 XXXX

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Это будет работать, но только если ваша цель разделена пробелом.

val st = "ABC  #12345768 213123 Checks juan #54321 asda"
val new_value = st.split(" ").map{ s =>
  if (s matches "#\\d{5}") s
  else "X" * s.length
}.mkString(" ")
//new_value: String = XXX  XXXXXXXXX XXXXXX XXXXXX XXXX #54321 XXXX
0 голосов
/ 01 июня 2018

Вы можете использовать

val st = "ABC  #12345768 213123 Checks juan #54321 asda"
val Replace = """(#\d{5})(?!\d)|\S""".r
val new_value= Replace replaceAllIn (st, m => if (m.group(1) == null) "X" else m.group(1) )
println(new_value)
// => XXX  XXXXXXXXX XXXXXX XXXXXX XXXX #54321 XXXX

См. Демоверсию Scala .

Подробности

  • (#\d{5})(?!\d) - сопоставляет и вводит в группу 1 хеш-символ и 5 цифр после него, за которыми не следует цифра
  • | - или
  • \S - просто совпадает с пробеломchar.

Совпадение обрабатывается в обратном вызове: if (m.group(1) == null) "X" else m.group(1) означает, что если сопоставляется группа 1, заменить ее значением группы (не заменять совпадение), в противном случае заменить найденный символ на X.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...