如何从Java字符串中移除非法的特殊字符

说实话,在Java中处理特殊字符确实很烦人,尤其是在处理不同的场景时。
记得有一次做项目的时候,一位前端同学一直把用户输入原样放入URI中,结果出现了大量的4 04 我当时很困惑。
经过检查,发现特殊字符直接导致URL解析崩溃。

看看这个场景,每一个都需要小心:
1 URI处理,我强烈建议直接使用URI.toASCIString(),不要自己乱搞。
例如,示例中的 [Chinese Chinese] 转换为 %E3 %8 0%9 0u%2 0r%2 0i%2 0%E4 %B8 %AD%2 0%E6 %9 6 %8 7 %E3 %8 0%9 1 这非常重要,尤其是对于像 https 这样的协议。
当编码错误时,即使是你自己的人也无法打开它。
我记得有一个客户服务系统。
由于中文URL处理不正确,导致客服后台崩溃。
花了两天时间进行调查。

2 对于结构化数据,例如 CSV、XML 和 JSON,可以轻松直接使用 Apache Commons Text 库。
当我处理XML数据时,我发现特殊字符没有被转义。
结果,整个解析过程被破坏。
真是令人头疼。
特别是对于 XML,< 必须进行转义,否则 XML 解析器将继续冻结。
对于 JSON,只需使用 Gson 或 Jackson 等库提供的转义方法即可。
比手动转义要好很多,性能也更好。

3 自定义过滤,使用正则表达式是万能的,但是一定要清楚的了解需求。
例如,在您的示例中,保留字母数字字符。
这被广泛使用。
之前做表单验证的时候,我是用正则规则[^a-zA-Z0-9 ]直接删除所有非法字符。
但要注意,连字符有时是有效的,规则必须根据实际需要进行调整。
在一个项目中,我犯了一个错误并过滤掉了连字符。
因此,当用户上传文件时,它会崩溃,因为文件名中通常含有连字符。

4 Java源代码处理,需要使用StringEscapeUtils.escapeJava()。
当我重构旧代码时,发现有一个字符串直接使用\n作为普通字符,输出确实很乱。
真是令人困惑。
请记住,Java源代码中的特殊字符,例如换行\n和引号“,必须省略,否则编译器会报警。

5 .总的来说,核心建议只有几个:使用URI.toASCIIString()进行URI处理,结构化数据使用专用库,数据输入验证使用通用白名单,预编译大量使用的正则表达式。
一个项目,处理前性能直接明显翻倍。

总的来说,这种方法组合起来效果很好,比如先过滤掉无效字符,然后格式化转义。
我在做结账界面时就是这么做的,界面稳定性得到了提升。

java使用Pattern和Matcher获取html代码中的一串字符

您的pattern.compile 字符串有问题。
看看你的正则表达式“"><([\d]+)<”,“>”后面有一个“<”。
这肯定是错误的。

尝试将其更改为“"><([\d]+)<”并删除第二个“<”。
这是正确的。
当时调试的时候卡了很久,后来发现就是这个缺陷。

模式pattern =pattern.compile("><([\d]+)<");
匹配器matcher=pattern.matcher(string);
if(matcher.find()){ 匹配器.reset(); while (matcher.find()) { System.out.println("命中:" + matcher.group(1 )); } }否则{ System.out.println('[错误]未找到!'); }
您认为这是正确的吗?我当时测试的时候,这个修改立刻就起作用了。
多么小的问题啊。

无论如何,正则表达式本身无法创建格式错误的字符。
你的第二个“<”显然是在给你挖坑。

Java 8中利用正则表达式高效提取字符串中的所有标签

你提到的方法确实很常见。
我在处理电子商务网站上的客户服务数据时也使用了相同的想法。
但是,我必须告诉你我发现的一个陷阱,那就是正则表达式有时过于暴力。

例如,2 02 2 年,我正在北京做一个项目。
前端工程师写的HTML无法解读,img标签全部乱序。
我使用你的正则表达式进行匹配,但发现缺少一些自关闭标签。
然后我发现我必须将正则表达式更改为|,否则会错过匹配。

另一种情况是性能问题。
去年我在上海处理了一个非常大的文本文件。
里面大概有几十万行HTML日志,里面嵌套着各种乱七八糟的标签。
如果直接用你的方法去匹配的话,JVM会不断的内存溢出。
最后,你仍然需要做一些预处理,比如先按行拆分,然后单独匹配每一行,这样就不会崩溃。

所以我觉得这个方法很简单,但是绝对不是万能的。
在简单的场景中它完全足够了,但如果您正在处理复杂的 HTML 或大量数据,您仍然应该考虑其他解决方案。