首页 > 解决方案 > 正则表达式从给定字符串中修剪特殊字符

问题描述

我已经从源中提取了数据,现在它是一组令牌。这些标记在结尾或有时在开头包含垃圾字符或特殊字符。例如我有以下设置..

该数据应分别如下...

为了净化这个字符串集,我实现了下面的方法,它工作正常。在 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;
}

但是我仍然对我使用的正则表达式不满意,因为我有大量数据。想看看有没有更好的选择。

标签: javaregex

解决方案


我想用\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());

推荐阅读