我正在尝试遍历字符以使用“诅咒单词过滤器”,有一个配置文件定义了将替换为哪些诅咒单词。有时我的代码会抓取键的最后一个字母/数字,并将其放在键字符串的末尾。
尝试以几种不同的方式执行此操作,此操作的整个尝试是避免区分大小写并找到击败它的所有可能尝试。 这是一个破坏示例-http://prntscr.com/nqyirl
public void onChat(AsyncPlayerChatEvent event)
{
String originalMessage = event.getMessage();
ArrayList<String> swearWords = new ArrayList<>();
for (String key : getConfig().getConfigurationSection("replace-words").getKeys(false))
swearWords.add(key);
ArrayList<Character> charArrayList = new ArrayList<>();
for (char c : originalMessage.toCharArray())
charArrayList.add(c);
for (String swearWord : swearWords)
{
Bukkit.broadcastMessage(swearWord);
int startIndex;
if ((startIndex = originalMessage.toLowerCase().indexOf(swearWord)) != -1)
{
int endIndex = startIndex + swearWord.length();
for (int i = startIndex; i < endIndex; i++)
{
charArrayList.remove(startIndex);
charArrayList.trimToSize();
}
char[] replaceWith = getConfig().getString("replace-words." + swearWord).toCharArray();
Bukkit.broadcastMessage(new String(replaceWith));
for (int i = 0; i < replaceWith.length; i++) {
char c = replaceWith[i];
charArrayList.add(startIndex + i, c);
}
}
}
final char[] array = new char[charArrayList.size()];
for (int i = 0; i < array.length; i++)
array[i] = charArrayList.get(i);
event.setMessage(new String(array));
}
配置文件-
#configurables, enjoy
replace-words:
test1234: testo22345566
应该替换test1234 with testo22345566
,而在末尾添加4。制作-testo223455664。此处的示例-http://prntscr.com/nqyirl
编辑:我已经突破了,超过7个字符的内容都会破坏它。
答案 0 :(得分:1)
您可能只是不删除最后一个符号。我的猜测是变化
(int i = startIndex; i < endIndex; i++)
到
(int i = startIndex; i <= endIndex; i++)
应该解决问题
答案 1 :(得分:0)
为什么将其更改为char []? 字符串内部有一个char [],但为您提供了更多,更轻松的替换功能。
例如originalMessage.replaceAll(“ test1234”,“ testo22345566”) 将用testo22345566替换所有test1234出现的情况
有关该方法的信息:https://www.javatpoint.com/java-string-replaceall
这使得添加正则表达式过滤器而不是一对一替换配置成为可能。 (字符串上的replaceAll函数使用正则表达式搜索出现的情况)
例如
#configurables, enjoy
replace-words:
(?i)test[0-9]{4}: testo22345566
如果是repleaceAll函数,则对所有不区分大小写的值(后接4个数字)的字符串都起作用
请注意,如果脏话替换器可以重新创建另一个脏话,则可能需要多次通过此替换器。
编辑:由于一些评论而修改:
您还可以只使用您的配置,但仍然使用originalMessage.replaceAll(wordOfTheConfigList,replacementword)
String newMessage = originalMessage;
String inBetweenChars = "([\s\._]*)";
for (String swearWord : swearWords){
String searchWord = "(?i)"+inBetweenChars+String.join(inBetweenChars,swearWord) + inBetweenChars;
String replaceWith = getConfig().getString("replace-words." + swearWord)
newMessage = newMessage.replaceAll(searchWord,replaceWith))
}
event.setMessage(newMessage);
有了这个答案,您只能在配置中使用普通文本,因此没有[0-9]或其他正则表达式功能,因为这会导致奇怪的[\ s0 \ s- \ s9 \ s]有点问题(无法正常工作) ),但由于您未在该配置中使用正则表达式,所以我希望这不是一个真正的问题。