Ваше регулярное выражение не совсем верно.
Когда вы пишете: [RQrq1-6]*
Вы говорите, совпадение ноль или более повторений любого символа в квадратных скобках ...
Попробуйте это [RQrq1-6]
- что означает совпадение ровно с одним.
Я написал небольшую программу с шипами:
import java.util.regex.Pattern;
public class Spike {
public static void main(String[] args) {
testIt("Q");
testIt("q");
testIt("z");
testIt("Z");
testIt("R");
testIt("r");
testIt("0");
testIt("1");
testIt("2");
testIt("3");
testIt("4");
testIt("5");
testIt("6");
testIt("7");
testIt("02");
testIt("11");
testIt("17");
testIt(""); // should fail, used to pass with the question's regex
}
public static void testIt(String sample) {
System.out.print(sample+" ");
if (Pattern.matches("[RQrq1-6]*", sample)) {
System.out.println("match");
} else {
System.out.println("fail");
}
}
}
Вывод был таким:
Q match
q match
z fail
Z fail
R match
r match
0 fail
1 match
2 match
3 match
4 match
5 match
6 match
7 fail
02 fail
11 match
17 fail
match
Сняв звезду в регулярном выражении:
Q match
q match
z fail
Z fail
R match
r match
0 fail
1 match
2 match
3 match
4 match
5 match
6 match
7 fail
02 fail
11 fail
17 fail
fail
Как игнорировать пробелы
Заменить эту версию testit:
public static void testIt(String sample) {
System.out.print(sample+" ");
Pattern pattern = Pattern.compile("\\s*([RQrq1-6])\\s*");
Matcher matcher = pattern.matcher(sample);
if (matcher.matches()) {
System.out.println("match '"+matcher.group(1)+"'");
} else {
System.out.println("fail");
}
}
Вот критические строки вывода:
testIt(" 6");// ignore space tests
testIt(" 7");// ignore space tests
testIt("6 ");// ignore space tests
testIt("7 ");// ignore space tests
6 match '6'
7 fail
6 match '6'
7 fail
Он использует концепцию, называемую «группа захвата». Группа захвата - это часть регулярного выражения, которой присваивается номер, чтобы можно было извлечь конкретную строку символов, которая соответствует. Здесь мы используем группу захвата, чтобы вытащить символ из необязательного пробела.