From 5d3d732c25ced70e57ce840a39d9deb5d57ed88f Mon Sep 17 00:00:00 2001 From: benwoo1110 Date: Fri, 9 Oct 2020 12:19:32 +0800 Subject: [PATCH 1/2] Fix issue where special chars cause PatternSyntaxException Escape regex special chars for help command --- .../MultiverseCore/commands/HelpCommand.java | 20 ++++++------------- .../commands/PaginatedCommand.java | 13 ++++++++++++ 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java index 90913026..59a429e4 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/HelpCommand.java @@ -40,24 +40,16 @@ public class HelpCommand extends PaginatedCoreCommand { @Override protected List getFilteredItems(List availableItems, String filter) { + String expression = "(?i).*" + cleanFilter(filter) + ".*"; List filtered = new ArrayList(); for (Command c : availableItems) { - if (stitchThisString(c.getKeyStrings()).matches("(?i).*" + filter + ".*")) { + if (stitchThisString(c.getKeyStrings()).matches(expression) + || c.getCommandName().matches(expression) + || c.getCommandDesc().matches(expression) + || c.getCommandUsage().matches(expression) + || c.getCommandExamples().stream().anyMatch(eg -> eg.matches(expression))) { filtered.add(c); - } else if (c.getCommandName().matches("(?i).*" + filter + ".*")) { - filtered.add(c); - } else if (c.getCommandDesc().matches("(?i).*" + filter + ".*")) { - filtered.add(c); - } else if (c.getCommandUsage().matches("(?i).*" + filter + ".*")) { - filtered.add(c); - } else { - for (String example : c.getCommandExamples()) { - if (example.matches("(?i).*" + filter + ".*")) { - filtered.add(c); - break; - } - } } } return filtered; diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java index c3ddf09b..6d78cb3d 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java @@ -13,12 +13,14 @@ import org.bukkit.entity.Player; import org.bukkit.plugin.java.JavaPlugin; import java.util.List; +import java.util.regex.Pattern; /** * A generic paginated command. * @param The type of items on the page. */ public abstract class PaginatedCommand extends Command { + private final Pattern REGEX_SPECIAL_CHARS = Pattern.compile("[.+*?\\[^\\]$(){}=!<>|:-\\\\]"); private static final int DEFAULT_ITEMS_PER_PAGE = 9; /** * The number of items per page. @@ -40,12 +42,23 @@ public abstract class PaginatedCommand extends Command { /** * Gets filtered items. + * * @param availableItems All available items. * @param filter The filter-{@link String}. * @return A list of items that match the filter. */ protected abstract List getFilteredItems(List availableItems, String filter); + /** + * Escape regex special characters from filter + * + * @param filter The filter-{@link String}. + * @return String with regex characters escaped + */ + protected String cleanFilter(String filter) { + return REGEX_SPECIAL_CHARS.matcher(filter.toLowerCase()).replaceAll("\\\\$0"); + } + /** * Constructs a single string from a list of strings. * From 473ccd09d77a432fc9d255ea15cea285aa470fd6 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Fri, 16 Jul 2021 21:38:57 +0800 Subject: [PATCH 2/2] Don't need to toLowerCase filter. --- .../onarandombox/MultiverseCore/commands/PaginatedCommand.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java b/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java index 6d78cb3d..2dd11a2a 100644 --- a/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java +++ b/src/main/java/com/onarandombox/MultiverseCore/commands/PaginatedCommand.java @@ -56,7 +56,7 @@ public abstract class PaginatedCommand extends Command { * @return String with regex characters escaped */ protected String cleanFilter(String filter) { - return REGEX_SPECIAL_CHARS.matcher(filter.toLowerCase()).replaceAll("\\\\$0"); + return REGEX_SPECIAL_CHARS.matcher(filter).replaceAll("\\\\$0"); } /**