从字符串中删除所有不在白名单上的字符

Posted

技术标签:

【中文标题】从字符串中删除所有不在白名单上的字符【英文标题】:Remove all characters from string which are not on whitelist 【发布时间】:2013-02-21 08:15:48 【问题描述】:

我正在尝试编写 java 代码来删除所有不需要的字符并让只有列入白名单的字符。

例子:

String[] whitelist = "a", "b", "c"..."z", "0"..."9", "[", "]",...

我只想要字母(小写和大写)和数字+我要添加的一些下一个字符。 然后我将为字符串中的每个字符启动for() 循环,如果它不在白名单上,则将其替换为空字符串。

但这不是好的解决方案。也许可以使用模式(正则表达式)以某种方式完成?谢谢。

【问题讨论】:

Maybe it could be done somehow using pattern (regex)? 是的,你是对的。你可以开始here 允许使用什么样的字符?根据要求,正则表达式可能会有很大不同。 【参考方案1】:

是的,您可以使用String.replaceAll,它采用正则表达式:

String input = "BAD good  []";
String output = input.replaceAll("[^a-z0-9\\[\\]]", "");
System.out.println(output); // good[]

或者在Guava 中,您可以使用CharMatcher

CharMatcher matcher = CharMatcher.inRange('a', 'z')
                          .or(CharMatcher.inRange('0', '9'))
                          .or(CharMatcher.anyOf("[]"));
String input = "BAD good  []";
String output = matcher.retainFrom(input);

这只是显示小写版本,更容易演示。要包含大写字母,请在正则表达式中使用"[^A-Za-z0-9\\[\\]]"(以及您想要的任何其他符号) - 对于CharMatcher,您可以将orCharMatcher.inRange('A', 'Z') 一起使用。

【讨论】:

在第一个代码中,使用正则表达式,我如何将下一个字符添加到白名单(不仅是 [ 和 ],还有空格和下一个字符)? 既然 PerwinCZ 是在寻找大小写字母,应该是[^A-Za-z0-9\\[\\]] @jonhopkins:我只是在继续代码中的内容 - 将进行编辑以澄清这一点。 好的,我自己修好了。当我想添加下一个字符时,我在关闭之前添加到正则表达式]:\\char. @PerwinCZ:您不需要转义所有字符 - 只有在正则表达式中具有特殊含义的字符。【参考方案2】:

您可以尝试匹配不在白名单中的所有内容并将其替换为空字符串:

String in = "asng $%& 123";
//this assumes your whitelist contains word characters and whitespaces, adapt as needed
System.out.println(in.replaceAll( "[^\\w\\s]+", "" )); 

【讨论】:

以上是关于从字符串中删除所有不在白名单上的字符的主要内容,如果未能解决你的问题,请参考以下文章

HTML Agility Pack 条带标签不在白名单中

白名单是啥意思?

具有字符限制的 Javascript 正则表达式白名单

Pytesseract 设置字符白名单

javascript Paysafe:查询字符串抓取器(仅限白名单)

从 Python 字符串中删除不在允许列表中的 HTML 标记