java - 正则表达式从给定字符串中修剪特殊字符
问题描述
我已经从源中提取了数据,现在它是一组令牌。这些标记在结尾或有时在开头包含垃圾字符或特殊字符。例如我有以下设置..
- 制造交通
- (设备
- 交通平静)
- 交通-
- 合成的,
- 人造草皮。)
该数据应分别如下...
- 制造交通
- 设备
- 交通平静
- 交通
- 合成的
- 人造草皮
为了净化这个字符串集,我实现了下面的方法,它工作正常。在 regex101.com 上查看...
public Filter filterSpecialCharacters() {
String regex = "^([^a-z0-9A-Z]*)([a-z0-9A-Z])(.*)([a-z0-9A-Z])([^a-z0-9A-Z]*)$";
set = set
.stream()
.map(str -> str.replaceAll(regex, "$2$3$4"))
.collect(Collectors.toSet());
return this;
}
但是我仍然对我使用的正则表达式不满意,因为我有大量数据。想看看有没有更好的选择。
解决方案
我想用\p{Punct}
删除所有这些标点符号!"#$%&'()*+,-./:;<=>?@[\]^_
{|}~`
String regex = "^\\p{Punct}*([a-z0-9A-Z -]*)\\p{Punct}*$";
set = set.stream()
.map(str -> str.replaceAll(regex, "$1"))
.collect(Collectors.toSet());
=>[synthetic, devices, traffic-calming, manufactured traffic , artificial turf]
看看这个正则表达式结构总结
或者像@Ted Hopp在评论中提到的那样,您可以使用两张地图,一张从乞求中删除特殊字符,第二张从末尾删除它们:
set = set.stream()
.map(str -> str.replaceFirst("^[^a-z0-9A-Z]*", ""))
.map(str -> str.replaceFirst("[^a-z0-9A-Z]*$", ""))
.collect(Collectors.toSet());
推荐阅读
- python-3.x - Subprocess.run() 找不到路径
- javascript - 如何使用 Jquery 设置 X 图像的大小
- webforms - 使用表单身份验证的 ASP.Net Web 表单和使用 JWT 令牌的 MVC 之间的单点登录
- c# - C# 控制台清除输入行
- ios - 尝试构建存档 Xcode 时出错:clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用)
- mysql - MySQL 通过乘以其他行中的值返回 1 或 0
- sql - 访问 SQL 问题
- spring - 如何在 Spring Boot 中添加 URL 前缀
- ssl - 来自 KeyVault 的 Kestrel 安全 HTTPS X509 证书
- c# - 如何打开任务栏中的应用程序?