首页 > 解决方案 > 如何过滤字符串以仅包含允许的字符?

问题描述

我正在尝试过滤字符串以仅包含我允许的字符。例如,假设我允许字母 [AZ](不区分大小写)和下划线('_')。

所以假设我有字符串: "I am a happy_bear and I sk@8 because it's gr8"

我希望它被过滤为: "I am a happy_bear and I sk because its gr"

到目前为止我已经尝试过:

//Define a method to check allowed charachters
 private boolean checkAllowed(Character ch) {
        return Character.isLetter(ch) || ch == '_';
    }
// loop through string
for (int i = 0; i < someString.length(); i++) {
            if (this.checkAllowed(someString.charAt(i)) {
                // append to a list
            }
        }

如何过滤字符串以仅包含我允许的字符?这可以通过类似流的过滤来实现吗?如果没有正则表达式,这可以更容易完成吗?(我正在寻找更好的方法来做到这一点)

标签: javajava-8

解决方案


这可以通过类似流的过滤来实现吗?

是的:

String s = "I am a happy_bear and I sk@8 because it's gr8";

String d = s.codePoints()
    .filter(c -> Character.isLetter(c) || c == '_' || c == ' ')
    .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append)
    .toString();

System.out.println(d);

...

I am a happy_bear and I sk because its gr

codePoints()返回

来自此序列的 Unicode 代码点的 IntStream

然后使用过滤和收集StringBuilder流。

不过,正则表达式解决方案可能更简洁明了,请看replaceAll() method.

您的循环和“检查方法”也很好,只需使用 aStringBuilder创建一个仅包含“通过”检查的字符的新字符串。


推荐阅读