Java. Замена символов в строке / Replacing characters in string

max аватар
93
Находится в разделах:

Вот решил заняться изобретением очередного "велосипеда". 

В классе String есть замечательный метод replaceAll(), который заменяет символы/подстроки в данной строке.  Работает он отлично до тех пор, пока заменяемая строка не будет содержать специальных символов, входящих в семантику регулярных выражений. Вот тут и начинается фигня (с точки зрения человека, не знакомого с регулярными выражениями ) с заменой. А ведь замена подстроки в строке задача не такая уже и тяжелая и поддерживается в большинстве языков программирования. 

Так вот, зачем этот пост. Этот пост для тех, у кого нет ни малейшего желания изучать регулярные выражения (regular expressions / regexp). 

Вот пример аналогичной функции, своего шестиколесного велосипеда, выполняющего аналогичные функции, но абсолютно не понимающего регулярных выражений. То есть, если вы попросите его заменить подстроку "[][/23x1]" или еще какую-нибудь хитрую подстроку в строке, то она заменит именно эти вхождения в строку, а не будет вычислять  "[][/23x1]", пытаясь найти в нем какой-то паттерн. 

Вот, собственно, и код:

 

Протестировал и вроде она работает. 

 

Если у вас есть другие варианты решения проблемы - поделитесь.

 

Обновление:

В комментариях было предложено использовать StringUtils из комплекта apache commons. 

Моим решением следует пренебречь.

Вот сигнатура метода из документации:

replace

public static String replace(String text,
                             String searchString,
                             String replacement)

Replaces all occurrences of a String within another String.

null reference passed to this method is a no-op.

 StringUtils.replace(null, *, *)        = null
 StringUtils.replace("", *, *)          = ""
 StringUtils.replace("any", null, *)    = "any"
 StringUtils.replace("any", *, null)    = "any"
 StringUtils.replace("any", "", *)      = "any"
 StringUtils.replace("aba", "a", null)  = "aba"
 StringUtils.replace("aba", "a", "")    = "b"
 StringUtils.replace("aba", "a", "z")   = "zbz"
 

 

Parameters:
text - text to search and replace in, may be null
searchString - the String to search for, may be null
replacement - the String to replace it with, may be null
Returns:
the text with any replacements processed, null if null String input
See Also:
replace(String text, String searchString, String replacement, int max)


Конец
Леонардо да Винчи спешит напомнить, что любое препятствие преодолевает настойчивость.

max аватар

Отличное решение! Про apache commons совсем забыл :).  

Велосипед отменяется :)

А я тоже раньше думал, что replaceAll(), заменяет все вхождения подстроки, а replace(), только первое, ан нет, это тоже самое только без регулярок, так что не к чему тут лесопеды.

А чем вас не устраивает метод replace описанный в классе String?

>А чем вас не устраивает метод replace описанный в классе String

Наверное тем, что он заменяет не строки а только отдельные символы

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке