2 * Svjatoslav Commons - shared library of common functionality.
3 * Copyright ©2012-2020, 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 GlobMatcher {
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.
36 * @param inputString input string
37 * @param wildcardExpression wildcard expression
38 * @return <code>true</code> if input string matches input pattern
40 public static boolean match(final String inputString,
41 final String wildcardExpression) {
43 if (inputString == null)
46 if (wildcardExpression == null)
51 for (i = 0; i < inputString.length(); i++) {
52 if (i >= wildcardExpression.length())
54 final char wildCardChar = wildcardExpression.charAt(i);
55 if (wildCardChar == '*')
56 return matchPiece(inputString, i, wildcardExpression, i + 1);
57 if (wildCardChar != '?')
58 if (inputString.charAt(i) != wildCardChar)
62 return checkWildCardEnd(wildcardExpression, i);
65 private static boolean matchPiece(final String inputString,
66 final int inputStringIndex, final String wildcardExpression,
67 final int wildCardExpressionIndex) {
69 int wildCardPosition = wildCardExpressionIndex;
71 for (int i = inputStringIndex; i < inputString.length(); i++) {
73 wildCardPosition = wildCardExpressionIndex;
78 for (int j = i; j < inputString.length(); j++) {
79 if (wildCardPosition >= wildcardExpression.length())
80 break subMatchAttempt;
81 final char wildCardChar = wildcardExpression
82 .charAt(wildCardPosition);
84 if (wildCardChar == '*')
85 return matchPiece(inputString, j, wildcardExpression,
86 wildCardPosition + 1);
88 if (wildCardChar != '?')
89 if (inputString.charAt(j) != wildCardChar)
90 break subMatchAttempt;
95 return checkWildCardEnd(wildcardExpression, wildCardPosition);
100 return checkWildCardEnd(wildcardExpression, wildCardPosition);