2 * Svjatoslav Commons - shared library of common functionality.
3 * Copyright ©2012-2014, Svjatoslav Agejenko, svjatoslav@svjatoslav.eu
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of version 3 of the GNU Lesser General Public License
7 * or later as published by the Free Software Foundation.
10 package eu.svjatoslav.commons.string;
12 public class WildCardMatcher {
15 * Allow only for * in wildcards
17 private static boolean checkWildCardEnd(final String wildcardExpression,
18 int wildCardPosition) {
19 for (; wildCardPosition < wildcardExpression.length(); wildCardPosition++) {
20 final char wildCardChar = wildcardExpression
21 .charAt(wildCardPosition);
22 if (wildCardChar != '*')
31 * Test input string against wildcard expression.
32 * * -- corresponds to any amount of characters.
33 * ? -- corresponds to any single character.
38 * @param wildcardExpression
40 * @return <code>true</code> if input string matches input pattern
42 public static boolean match(final String inputString,
43 final String wildcardExpression) {
45 if (inputString == null)
48 if (wildcardExpression == null)
53 for (i = 0; i < inputString.length(); i++) {
54 if (i >= wildcardExpression.length())
56 final char wildCardChar = wildcardExpression.charAt(i);
57 if (wildCardChar == '*')
58 return matchPiece(inputString, i, wildcardExpression, i + 1);
59 if (wildCardChar != '?')
60 if (inputString.charAt(i) != wildCardChar)
64 return checkWildCardEnd(wildcardExpression, i);
67 private static boolean matchPiece(final String inputString,
68 final int inputStringIndex, final String wildcardExpression,
69 final int wildCardExpressionIndex) {
71 int wildCardPosition = wildCardExpressionIndex;
73 for (int i = inputStringIndex; i < inputString.length(); i++) {
75 wildCardPosition = wildCardExpressionIndex;
79 for (int j = i; j < inputString.length(); j++) {
80 if (wildCardPosition >= wildcardExpression.length())
81 break subMatchAttempt;
82 final char wildCardChar = wildcardExpression
83 .charAt(wildCardPosition);
85 if (wildCardChar == '*')
86 return matchPiece(inputString, j, wildcardExpression,
87 wildCardPosition + 1);
89 if (wildCardChar != '?')
90 if (inputString.charAt(j) != wildCardChar)
91 break subMatchAttempt;
96 return checkWildCardEnd(wildcardExpression, wildCardPosition);
101 return checkWildCardEnd(wildcardExpression, wildCardPosition);