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.
37 public static boolean match(final String inputString,
38 final String wildcardExpression) {
40 if (inputString == null)
43 if (wildcardExpression == null)
48 for (i = 0; i < inputString.length(); i++) {
49 if (i >= wildcardExpression.length())
51 final char wildCardChar = wildcardExpression.charAt(i);
52 if (wildCardChar == '*')
53 return matchPiece(inputString, i, wildcardExpression, i + 1);
54 if (wildCardChar != '?')
55 if (inputString.charAt(i) != wildCardChar)
59 return checkWildCardEnd(wildcardExpression, i);
62 private static boolean matchPiece(final String inputString,
63 final int inputStringIndex, final String wildcardExpression,
64 final int wildCardExpressionIndex) {
66 int wildCardPosition = wildCardExpressionIndex;
68 for (int i = inputStringIndex; i < inputString.length(); i++) {
70 wildCardPosition = wildCardExpressionIndex;
74 for (int j = i; j < inputString.length(); j++) {
75 if (wildCardPosition >= wildcardExpression.length())
76 break subMatchAttempt;
77 final char wildCardChar = wildcardExpression
78 .charAt(wildCardPosition);
80 if (wildCardChar == '*')
81 return matchPiece(inputString, j, wildcardExpression,
82 wildCardPosition + 1);
84 if (wildCardChar != '?')
85 if (inputString.charAt(j) != wildCardChar)
86 break subMatchAttempt;
91 return checkWildCardEnd(wildcardExpression, wildCardPosition);
96 return checkWildCardEnd(wildcardExpression, wildCardPosition);