java—如何过滤字符串以只包含允许的字符?

ljo96ir5  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(424)

我正在尝试筛选字符串,使其仅包含我允许的字符。例如,假设我允许字母[a-z](不区分大小写)和下划线('''')。
假设我有字符串: "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
            }
        }

如何筛选字符串以仅包含允许的字符?这是否可以通过流式过滤实现?如果没有regex,这能做得更容易吗(我正在寻找更好的方法)

pwuypxnk

pwuypxnk1#

如果您愿意使用第三方库,那么以下内容将适用于eclipse集合。

@Test
public void stringFilter()
{
    String string = Strings.asChars("I am a happy_bear and I sk@8 because it's gr8")
            .select(this::checkAllowed)
            .toString();
    Assert.assertEquals("I am a happy_bear and I sk because its gr", string);
}

private boolean checkAllowed(Character ch)
{
    return Character.isLetter(ch) || ch == '_' || Character.isSpaceChar(ch);
}

注意:我是eclipse集合的提交者。

z6psavjg

z6psavjg2#

这是否可以通过流式过滤实现?
是的:

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` .
您的循环和“检查方法”也很好,只需使用 `StringBuilder` 创建只包含“通过”检查的字符的新字符串。

相关问题