Как я могу удалить все конечные обратные косые черты из строки в scala?

Я хочу удалить из строки все конечные обратные косые черты ('\').

Например:

"ab"       -> "ab" 
"ab\\\\"   -> "ab"
"\\\\ab\\" -> "\\\\ab"
"\\"       -> ""

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

val str = """\\\\q\\"""
val regex = """^(.*[^\\])(\\+)$""".r
str match  {
  case regex(rest, slashes) => str.stripSuffix(slashes)
  case _ => str
}

Попробуйте: str.replaceFirst("\\\\+$", "");

anubhava 10.08.2018 17:07

Может быть, добавить это в качестве ответа? Вроде здорово :-)

C4stor 10.08.2018 18:06

@anubhava, работает. Думаю, тебе больше не нужна репутация :)

sujit 10.08.2018 19:55

Лучше использовать str.replaceFirst("""\\+$""", "");, не нужно переборщить.

Wiktor Stribiżew 10.08.2018 21:55
2
4
672
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Хотя это не регулярное выражение, я предлагаю более простое решение: str.reverse.dropWhile(_ == '\\').reverse

Незакрытый буквальный символ ... Обратные косые черты! Обратные косые черты! Вот почему это так весело! ;)

Andrey Tyukin 10.08.2018 17:31

Не использовать регулярное выражение, но вы можете использовать String.lastIndexWhere(p: (Char) ⇒ Boolean), чтобы получить позицию последнего символа, который не является '\', для подстроки до этого символа:

str.substring(0, str.lastIndexWhere(_ != '\\') + 1)

Вы можете сделать то же самое с функцией slice

str.slice(0,str.lastIndexWhere(_ != '\\')+1)

Да, он должен прокомментировать.

Manoj Kumar Dhakad 10.08.2018 20:00
Ответ принят как подходящий

Преобразование моего комментария в ответ. Это должно работать для удаления всех конечных обратных косых черт:

str = str.replaceFirst("\\\\+$", "");

\\\\+ соответствует 1+ обратной косой черте (одиночная обратная косая черта вводится как \\\\ в Java / Scala).

Если по какой-то причине вы решили использовать регулярное выражение, это можно сделать.

val regex = """[^\\]?(\\*)$""".r.unanchored
str match  {
  case regex(slashes) => str.stripSuffix(slashes)
}

Кажется, я усложнял решение простого вопроса, но спасибо, что изменил его по-моему. Могу я спросить, почему """\\+$""".r.unachored при замене в вашем ответе не работает?

sujit 10.08.2018 20:17

+ означает «один или несколько», поэтому строка без обратной косой черты не будет соответствовать. *, ноль или больше, всегда будет делать захват. Если нет обратной косой черты, то запись пуста, но все еще действительна.

jwvh 10.08.2018 20:27

Другие вопросы по теме