diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/WildcardMatchLoader.java b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/WildcardMatchLoader.java index ab6da416bd..ff7e94102e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/WildcardMatchLoader.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/grounditems/WildcardMatchLoader.java @@ -27,15 +27,11 @@ package net.runelite.client.plugins.grounditems; import com.google.common.base.Strings; import com.google.common.cache.CacheLoader; import java.util.List; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.annotation.Nonnull; +import net.runelite.client.util.WildcardMatcher; class WildcardMatchLoader extends CacheLoader { - // Regex used for matching item names with others - private static final Pattern WILDCARD_PATTERN = Pattern.compile("(?i)[^*]+|(\\*)"); - private final List nameFilters; WildcardMatchLoader(List nameFilters) @@ -55,26 +51,7 @@ class WildcardMatchLoader extends CacheLoader for (final String filter : nameFilters) { - final Matcher matcher = WILDCARD_PATTERN.matcher(filter); - final StringBuffer buffer = new StringBuffer(); - - buffer.append("(?i)"); - while (matcher.find()) - { - if (matcher.group(1) != null) - { - matcher.appendReplacement(buffer, ".*"); - } - else - { - matcher.appendReplacement(buffer, "\\\\Q" + matcher.group(0) + "\\\\E"); - } - } - - matcher.appendTail(buffer); - final String replaced = buffer.toString(); - - if (filteredName.matches(replaced)) + if (WildcardMatcher.matches(filter, filteredName)) { return true; } diff --git a/runelite-client/src/main/java/net/runelite/client/util/WildcardMatcher.java b/runelite-client/src/main/java/net/runelite/client/util/WildcardMatcher.java new file mode 100644 index 0000000000..354005a048 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/util/WildcardMatcher.java @@ -0,0 +1,57 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +public class WildcardMatcher +{ + private static final Pattern WILDCARD_PATTERN = Pattern.compile("(?i)[^*]+|(\\*)"); + + public static boolean matches(String pattern, String text) + { + final Matcher matcher = WILDCARD_PATTERN.matcher(pattern); + final StringBuffer buffer = new StringBuffer(); + + buffer.append("(?i)"); + while (matcher.find()) + { + if (matcher.group(1) != null) + { + matcher.appendReplacement(buffer, ".*"); + } + else + { + matcher.appendReplacement(buffer, "\\\\Q" + matcher.group(0) + "\\\\E"); + } + } + + matcher.appendTail(buffer); + final String replaced = buffer.toString(); + + return text.matches(replaced); + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/util/WildcardMatcherTest.java b/runelite-client/src/test/java/net/runelite/client/util/WildcardMatcherTest.java new file mode 100644 index 0000000000..53b48a0755 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/util/WildcardMatcherTest.java @@ -0,0 +1,43 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.util; + +import static junit.framework.TestCase.assertTrue; +import static net.runelite.client.util.WildcardMatcher.matches; +import static org.junit.Assert.assertFalse; +import org.junit.Test; + +public class WildcardMatcherTest +{ + @Test + public void testMatches() + { + assertTrue(matches("rune*", "rune pouch")); + assertTrue(matches("rune*", "Rune pouch")); + assertFalse(matches("Abyssal whip", "Adamant dagger")); + assertTrue(matches("rune*", "Runeite Ore")); + assertTrue(matches("Abyssal whip", "Abyssal whip")); + } +} \ No newline at end of file