Как сделать так, чтобы совпадение с регулярным выражением не удавалось, если проверенная строка все еще имеет оставшиеся символы? - PullRequest
1 голос
/ 20 октября 2011

Я пытаюсь проверить строку с помощью регулярного выражения, и эта проверка должна пройти, только если строка содержит только * h, * d, * w и / или * m, где * может быть любым числом.

Пока у меня есть это:

Pattern p = Pattern.compile("([0-9]h)|([0-9]d)|([0-9]w)|([0-9]m)");
Matcher m = p.matcher(strToCheck);
        if(m.find()){     
            //matching succesful code
        }

И он работает, чтобы обнаружить, есть ли какие-либо комбинации цифр и букв, присутствующие в проверенной строке, но это также работает, если ввод,например, "12x5d", потому что в нем есть "5d".Я не знаю, если это проблема с кодом или регулярное выражение.Есть ли способ добиться того, чего я хочу?

РЕДАКТИРОВАТЬ: Спасибо за ваши ответы до сих пор, но по запросу я постараюсь немного уточнить.Строка типа "1w 2d 3h" или "1w 1w" является допустимой и должна пройти, но что-то вроде "1w X 2d 3h", "1wX 2d" или "wdh" должно завершиться неудачей.

Ответы [ 5 ]

3 голосов
/ 20 октября 2011

используйте m.matches() или добавьте ^ и $ в начало и конец регулярного выражения или

изменить, но если вы хотите последовательности этих разделенных пробелами (как указано в комментариях), вы можете использовать

Pattern.compile("\\b\\d[hdwm]\\b");
Matcher m = p.matcher(strToCheck);
while(m.find()){
    //matching succesful code
}
2 голосов
/ 20 октября 2011

Во-первых, я думаю, что вы должны использовать matches() вместо find().Первый сопоставляет всю строку с регулярным выражением, тогда как последний ищет в строке.

Во-вторых, вы можете упростить регулярное выражение следующим образом: "[0-9][hdwm]".

Наконец, если число можетсодержать несколько цифр, используйте оператор +: "[0-9]+[hdwm]"

1 голос
/ 20 октября 2011

Если вы хотите принимать только такие слова, как 5d, как полное слово, а не только часть слова, вы можете использовать маркеры \b "границы слова" в регулярном выражении:

Pattern p = Pattern.compile("\\b([0-9]h)|([0-9]d)|([0-9]w)|([0-9]m)\\b");

Это позволит вам сопоставить строку типа "Dimension: 5h" и отклонить строку типа "Dimension: 12wx5h".

(Если, с другой стороны, вы хотите сопоставить, только если вся строка равна 5d илинапример, используйте matches(), как предлагали другие.)

1 голос
/ 20 октября 2011

попробуйте это:

Pattern p = Pattern.compile("[0-9][hdwm]");
Matcher m = p.matcher(strToCheck);
        if(m.matches()){     
            //matching succesful code
        }
0 голосов
/ 20 октября 2011

Вы можете написать это так "^\\d+[hdwm]$". Который должен соответствовать только на желаемых строках.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...