Использование метода replace для замены только одного символа или строки - PullRequest
0 голосов
/ 02 марта 2019

Моя проблема в том, что я хочу заменить только один конкретный символ или часть строки, а не остальные символы того же самого символа

мой пример

char one = '#';
char two = '#';
char three = '#';
char four = '#';
char five = '#';
char six = '#';
char seven = '#';
char eight = '#';
char nine = '#';

String chart = "\n"+ one + two + three + "\n" + four + five + six + "\n"+ seven 
     + eight + nine + "\n\n";

chart = chart.replace(five, '/');
System.out.print(chart);

Он выводит: ////// ///

Вместо: ### # / # ###

Любая помощь приветствуется!

Ответы [ 5 ]

0 голосов
/ 02 марта 2019
s = s.replaceFirst("((#[^#]*){5})#", "$1/") ;

Это заменяет (первое) вхождение 6th # на /, фактически ища 5 групп # ..., за которыми следует #.

Короткий, но медленный.

0 голосов
/ 02 марта 2019

В переменной position хранится номер события, которое вы хотите заменить. Как и в вашем случае, вы пытались заменить 5-й, поэтому теперь он хранится как 5.

    Pattern p = Pattern.compile("#");
    Matcher m = p.matcher(chart);
    int count = 0;
    int position = 5;
    int index = 0;
    while (m.find()) {
        count++;
        if (count == position - 1) {
            index = m.end();
        }
    }
    String regex = "([#\n]{" + index + "})(#)([#\\n]{1,})";
    chart = chart.replaceAll(regex, "$1/$3");
    System.out.println(chart);

Сначала я выясню, на каком символе заканчивается n-1 вхождение, и сохранил его в index . После этого в replaceAll У меня есть регулярное выражение, которое группирует строку из трех частей: одна перед заменяемым символом, следующая группа содержит только один символ, который является n-ым вхождением, а последняя группа содержит оставшиеся.$1/$3 означает замену всей строки на group1 , затем / , затем group3 .

0 голосов
/ 02 марта 2019

Создайте объект StringBuilder из вашей строки и используйте метод charAt .

https://www.tutorialspoint.com/java/lang/stringbuilder_charat.htm

И затем вызовите toString.

int replacePosition = 5;//Choose it.
String inputStr = getYourString();
StringBuilder sb = new StringBuilder(inputStr);
sb.chrAt(replacePosition);
String result = sb.toString();

Если у вас есть String, и вы хотите заменить только один ее символ, который повторяется не менее n раз, и заменить его n-ным вхождением (в вашем примере это пять), то высначала нужно найти его позицию, а затем применить решение, используя StringBuilder.charAt () .

Чтобы найти индекс вашего персонажа, вы можете просто просмотреть циклы или использовать метод indexOf () https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#indexOf(int,%20int)

n раза каждый раз с новой стартовой позицией из предыдущего вызова, если предыдущий indexOf был положительным.

0 голосов
/ 02 марта 2019

Это должно сработать:

MatchResult findNthOccurance(int n, Pattern p, CharSequence src){
    Matcher m = p.matcher(src);
    for(int i = 0; i<n; i++) m.find();
    return m;
}

По сути, он просто вызывает функцию поиска несколько раз для Matcher, полученного из Pattern.Удобно, что Matcher также является MatchResult, так что я могу просто вернуть его прямо вверх.

0 голосов
/ 02 марта 2019

Метод замены Java принимает 2 параметра - символ, который вы хотите заменить, и символ, которым вы его заменяете.
Поскольку все ваши символы одинаковы, вы не хотитеиспользовать метод replace, но вместо этого метод substring. Вот документация для него.

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