繁体   English   中英

如何在 Java 字符串中替换一种以上的字符

[英]How do I replace more than one type of Character in Java String

新手在这里。 任何有关此问题的帮助将不胜感激:

您将获得一个名为data的字符串变量,该变量仅包含字母和空格。 编写 Java 类以打印字符串的修改版本,其中所有小写字母都被替换为? 并且所有空格都替换为+ 一个例子如下所示: I Like Java变成了I+L???+J??? .

到目前为止我所拥有的:

public static void main (String[] args) {
    Scanner input = new Scanner(System.in);
    String data;

    //prompt
    System.out.println("Enter a sentence: ");

    //input
    data = input.nextLine();
    for (int i = 0; i < data.length(); i++) {
        if (Character.isWhitespace(data.charAt(i))) {
            data.replace("", "+");

            if (Character.isLowerCase(data.charAt(i))) {
                data.replace(i, i++, ); //not sure what to include here
            }
        } else {
            System.out.print(data);
        }
    }
}

任何建议,将不胜感激。

首先,您正在尝试对不可变的 String 对象进行更改。 实现您想要的简单方法是将字符串转换为字符数组并遍历数组项:

Scanner input = new Scanner(System.in);
String data;

//prompt
System.out.println("Enter a sentence: ");

//input
data = input.nextLine();

char[] dataArray = data.toCharArray();

for (int i = 0; i < dataArray.length; i++) {
    if (Character.isWhitespace(dataArray[i])) {
        dataArray[i] = '+';
    } else if (Character.isLowerCase(dataArray[i])) {
        dataArray[i] = '?';
    }
}

System.out.print(dataArray);

查看下面的代码并找出您的代码中有什么问题。 要包含多个正则表达式,请将字符放在方括号中:

import java.util.Scanner;

public class mainClass {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        System.out.print("Enter a sentence: ");
        String data = input.nextLine();

        String one = data.replaceAll(" ", "+");
        String two = one.replaceAll("[a-z]", "?");
        System.out.println(two);
    }
}

您可以通过链接String#replaceAll分两步完成。 在第一步中,将正则表达式[az]替换为? . 正则表达式[az]表示从az的字符。

public class Main {
    public static void main(String[] args) {
        String str = "I Like Java";
        str = str.replaceAll("[a-z]", "?").replaceAll("\\s+", "+");
        System.out.println(str);
    }
}

输出:

I+L???+J???

或者,您可以使用StringBuilder来构建所需的字符串。 您可以使用String变量而不是使用StringBuilder变量,但我建议您在这种情况下使用StringBuilder 构建所需字符串的逻辑很简单:

循环遍历字符串的所有字符并检查字符是否为小写字母。 如果是,附加? StringBuilder实例,否则如果字符是空格,则将+附加到StringBuilder实例,否则将字符按原样附加到StringBuilder实例。

演示:

public class Main {
    public static void main(String[] args) {
        String str = "I Like Java";
        StringBuilder sb = new StringBuilder();
        int len = str.length();
        for (int i = 0; i < len; i++) {
            char ch = str.charAt(i);
            if (Character.isLowerCase(ch)) {
                sb.append('?');
            } else if (Character.isWhitespace(ch)) {
                sb.append('+');
            } else {
                sb.append(ch);
            }
        }

        // Assign the result to str
        str = sb.toString();

        // Display str
        System.out.println(str);
    }
}

输出:

I+L???+J???

如果要求规定:

  1. 每个单词的第一个字符是一个字母(大写或小写),需要保持原样。
  2. 第二个字符以后可以是任何需要替换为? .
  3. 字符串的所有空白字符都需要替换为+

你可以这样做:

与之前的解决方案一样,将String#replaceAll两个步骤。 在第一步中,将正则表达式(?<=\\p{L})\\w替换为? . 正则表达式(?<=\\p{L})\\w表示:

  1. \\w指定一个单词 character
  2. (?<=\\p{L})指定一个字母的正向查找,即\\p{L}

在第二步中,只需将一个或多个空白字符即\\s+替换为+

演示:

public class Main {
    public static void main(String[] args) {
        String str = "I like Java";
        str = str.replaceAll("(?<=\\p{L})\\w", "?").replaceAll("\\s+", "+");
        System.out.println(str);
    }
}

输出:

I+l???+J???

或者,再次像之前的解决方案一样,您可以使用StringBuilder来构建所需的字符串。 循环遍历字符串的所有字符并检查字符是否为字母。 如果是,则将其附加到StringBuilder实例,然后循环遍历剩余的字符,直到用完所有字符或遇到空格字符。 如果遇到空白字符,将+附加到StringBuilder实例,否则附加? 到它。

演示:

public class Main {
    public static void main(String[] args) {
        String str = "I like Java";
        StringBuilder sb = new StringBuilder();
        int len = str.length();
        for (int i = 0; i < len; i++) {
            char ch = str.charAt(i++);
            if (Character.isLetter(ch)) {
                sb.append(ch);
                while (i < len && !Character.isWhitespace(ch = str.charAt(i))) {
                    sb.append('?');
                    i++;
                }
                if (Character.isWhitespace(ch)) {
                    sb.append('+');
                }
            }
        }

        // Assign the result to str
        str = sb.toString();

        // Display str
        System.out.println(str);
    }
}

输出:

I+l???+J???
package com.company;

import java.util.*;

public class dat {
    public static void main(String[] args) {
        System.out.println("enter the string:");
        Scanner ss = new Scanner(System.in);
        String data = ss.nextLine();
        for (int i = 0; i < data.length(); i++) {
            char ch = data.charAt(i);
            if (Character.isWhitespace(ch))
                System.out.print("+");
            else if (Character.isLowerCase(ch))
                System.out.print("?");
            else
                System.out.print(ch);
        }
    }
}

输入字符串:

i Love YouU
?+L???+Y??U

您可以使用String.codePoints方法获取此字符串字符的int值的流,并对其进行处理:

private static String replaceCharacters(String str) {
    return str.codePoints()
            .map(ch -> {
                if (Character.isLowerCase(ch))
                    return '?';
                if (Character.isWhitespace(ch))
                    return '+';
                return ch;
            })
            .mapToObj(Character::toString)
            .collect(Collectors.joining());
}
public static void main(String[] args) {
    System.out.println(replaceCharacters("Lorem ipsum")); // L????+?????
    System.out.println(replaceCharacters("I Like Java")); // I+L???+J???
}

另请参阅:替换字符串中的非 ASCII 字符

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM