Как изменить только буквы в строке, оставив пробелы, дефисы и апострофы? - PullRequest
0 голосов
/ 26 февраля 2020

В моей программе случайная строка (называемая ThingToGuess) выбирается из текстового файла и изменяется таким образом, что каждая буква после третьей заменяется звездочкой (эта строка звездочек называется NumberOfBlanks), и пользователь должен угадать, в какой исходной строке использовались первые три буквы.

Однако в новой строке необходимо оставить пробелы, апострофы и дефисы. Например, строка Man in the mirror будет изменена на Man ** *** ******

Что у меня есть только выходные данные Man *************.

String NumberOfBlanks = "";
for(int i=1; i<ThingToGuess.length(); i++){
    NumberOfBlanks = NumberOfBlanks +"*";
}
String OutputCharacters = ThingToGuess.substring(0,3)+ NumberOfBlanks;
OutputCharacters = OutputCharacters.substring(0,secondIndex)+' '+OutputCharacters.substring(secondIndex+1);
System.out.println(OutputCharacters);

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

Ответы [ 5 ]

2 голосов
/ 26 февраля 2020

Это должно решить вашу проблему.

String input = "Man in the mirror";
String output = input.substring(0,3) + input.substring(3,input.length()).replaceAll("[^ -\']","*");
System.out.println(output); // Prints "Man ** *** ******"

Мы делаем две вещи, беря первые три символа, как есть, и оставшиеся символы, мы заменяем все символы, кроме ПРОБЕЛ, ГИФЕН и АПОСТРОФ, на АСТЕРИСКУ

1 голос
/ 26 февраля 2020

Если вы используете Java 8 или 8 +

public static String maskLettersAndDigits(String input) {
    char[] chars = input.toCharArray();
    return IntStream.range(0, chars.length).mapToObj(i -> i > 2 && Character.isLetterOrDigit(chars[i]) ? "*" : String.valueOf(chars[i])).collect(Collectors.joining());
}
1 голос
/ 26 февраля 2020

Во-первых, когда вы перебираете и добавляете строку, лучше использовать StringBuilder. Так как использование оператора + в l oop увеличивает время выполнения программы. Подробнее здесь

Отвечая на ваш вопрос:

String s = "Man in the mirror";
        char[] charArr = s.toCharArray();
        for(int i=0; i<charArr.length;i++)
        {
            if((charArr[i]!=' ' || charArr[i]!='\'' || charArr[i]!='-') && i>2){
                charArr[i]='*';
            }
        }
        s= new String(charArr);
        System.out.println(s);

Этот метод решает проблему напрямую. Это также может быть решено с помощью регулярных выражений, как проиллюстрировал Хеманг

0 голосов
/ 26 февраля 2020

Решение с использованием регулярных выражений:

public class Main {
    public static void main(String[] args) {
        String thingToGuess = "Man in the mirror";
        System.out.println(thingToGuess.replaceAll("(?<!^.?.?)[^ -]", "*"));
    }
}

Вывод:

Man ** *** ******

Решение без регулярных выражений:

public class Main {
    public static void main(String[] args) {
        String thingToGuess = "Man in the mirror";
        StringBuilder output = new StringBuilder();
        output.append(thingToGuess.substring(0, 3));
        for (int i = 3; i < thingToGuess.length(); i++) {
            char ch = thingToGuess.charAt(i);
            if (Character.isLetterOrDigit(ch)) {
                output.append('*');
            } else {
                output.append(ch);
            }
        }
        System.out.println(output);
    }
}
0 голосов
/ 26 февраля 2020

Вам, вероятно, следует использовать этот метод, чтобы проверить, является ли символ буквой или цифрой, и преобразовать символ в «*», только если они есть.

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