【发布时间】:2014-12-27 11:18:34
【问题描述】:
假设我有一个List<String> 和一个空的List<Pattern>,这是将字符串中的单词转换为 Pattern 对象的最佳方法吗?
for(String word : stringList) {
patterns.add(Pattern.compile("\\b(" + word + ")\\b);
}
然后稍后在字符串上运行它;
for(Pattern pattern : patterns) {
Matcher matcher = pattern.matcher(myString);
if(matcher.matches()) {
myString = matcher.replaceAll("String[$1]");
}
}
replaceAll 位只是一个示例,但在我使用它时,大部分时间都会使用 $1。
有没有更有效的方法?因为我觉得这有点笨拙。顺便说一下,我在列表中使用了 80 个字符串,虽然使用的字符串是可配置的,所以不会总是这么多。
这被设计成有点脏话过滤器,所以我会让你假设列表中的单词,
输入的一个例子是"You're a <curse>",这个词的输出是"You're a *****",虽然情况可能并不总是这样,在某些时候我可能会从HashMap<String, String>读取,其中关键是捕获组,值是替换。
例子:
if(hashMap.get(matcher.group(1)) == null) {
// Can't test if \ is required. Used it here for safe measure.
matcher.replaceAll("\*\*\*\*");
} else {
matcher.replaceAll(hashMap.get(matcher.group(1));
}
【问题讨论】:
-
@RealSkeptic,我在开头和结尾添加了 \b 来解决这个问题,这不会解决你提到的问题,因为 \b 是单词边界吗?
-
@AvinashRaj,更新了一个例子。
-
这个词是否包含
<>符号? -
不应该这样做,但考虑到它的设计是可配置的,那么它可能在某个阶段。
-
单词开头是否包含
<符号,那么\\b将如何工作?