20 package net.sf.gridarta.var.crossfire.model.validation.checks;
22 import java.util.ArrayList;
23 import java.util.Arrays;
24 import java.util.Collection;
25 import java.util.Collections;
26 import java.util.regex.Matcher;
27 import java.util.regex.Pattern;
28 import org.jetbrains.annotations.NotNull;
45 private final Collection<String>
words =
new ArrayList<>();
52 @SuppressWarnings(
"CharacterComparison")
56 for (
final char ch : regEx.toCharArray()) {
57 if (ch < 32 || ch >= 128) {
58 generator.errorRegEx(
"non-ASCII character");
64 final boolean[] range =
new boolean[128];
65 while (pos < regEx.length()) {
66 final char ch = regEx.charAt(pos++);
69 generator.errorRegEx(
"use of regular expression operator '?'. This is usually not useful and therefore should be avoided");
73 generator.errorRegEx(
"use of regular expression operator '*'. This is usually not useful and therefore should be avoided");
77 generator.errorRegEx(
"use of regular expression operator '+'. This is usually not useful and therefore should be avoided");
81 generator.errorRegEx(
"use of regular expression operator '.'. This is usually not useful and therefore should be avoided");
85 if (pos < regEx.length() && regEx.charAt(pos) ==
'^') {
86 generator.errorRegEx(
"negated character range");
88 Arrays.fill(range,
false);
89 final int beginIndex = pos - 1;
90 boolean reportError =
true;
91 while (pos < regEx.length() && regEx.charAt(pos) !=
']') {
92 final char begin = regEx.charAt(pos++);
93 if (pos < regEx.length() && regEx.charAt(pos) ==
'-') {
95 if (pos >= regEx.length()) {
98 final char end = regEx.charAt(pos++);
100 generator.errorRegEx(
"confusing trailing '-' in character range");
106 if (
'a' <= begin && begin <=
'z' &&
'a' <= end && end <=
'z') {
108 }
else if (
'A' <= begin && begin <=
'Z' &&
'A' <= end && end <=
'Z') {
110 }
else if (
'0' <= begin && begin <=
'9' &&
'0' <= end && end <=
'9') {
113 generator.errorRegEx(
"character ranges should use only a-z, A-Z, or 0-9");
119 generator.errorRegEx(
"invalid character range");
121 }
else if (begin == end) {
122 generator.errorRegEx(
"single-character character range");
125 for (
char tmp = begin; tmp <= end; tmp++) {
127 generator.errorRegEx(
"duplicate character '" + tmp +
"' in character range");
136 generator.errorRegEx(
"duplicate character '" + begin +
"' in character range");
142 if (pos >= regEx.length()) {
143 generator.errorRegEx(
"unterminated character range");
149 for (i = 32; i < range.length; i++) {
155 generator.errorRegEx(
"empty character range");
158 for (j = i + 1; j < range.length; j++) {
163 if (j >= 128 && i !=
'?' && i !=
'*' && i !=
'+' && i !=
'.' && i !=
'[' && i !=
'\\' && i !=
'^' && i !=
'$' && i !=
'|') {
164 generator.errorRegEx(
"the word '" + regEx +
"' is the same as '" + regEx.substring(0, beginIndex) + (
char) i + regEx.substring(pos) +
"' which is probably not what was intended");
172 if (pos >= regEx.length()) {
173 generator.errorRegEx(
"trailing \\");
175 generator.errorRegEx(
"use of regular expression operator '\\'. This is usually not useful and therefore should be avoided");
182 generator.errorRegEx(
"the regular expression operator '^' must be used at the start of the word");
187 if (pos != regEx.length()) {
188 generator.errorRegEx(
"the regular expression operator '$' must be used at the end of the word");
193 addWord(regEx.substring(wordIndex, pos - 1), generator);
199 addWord(regEx.substring(wordIndex), generator);
210 if (word.startsWith(
" ")) {
211 generator.errorRegEx(
"the word '" + word +
"' starts with a space");
212 }
else if (word.endsWith(
" ")) {
213 generator.errorRegEx(
"the word '" + word +
"' ends with a space");
216 if (matcher.find()) {
217 generator.errorRegEx(
"the word '" + word +
"' checks for upper-case letters. Matches are case-insensitive, therefore matches should be specified in lower-case letters only");
228 return Collections.unmodifiableCollection(
words);