Как добиться сбоя сопоставления регулярных выражений, если в проверенной строке все еще есть оставшиеся символы?

#java #regex

#java #регулярное выражение

Вопрос:

Я пытаюсь проверить строку с помощью регулярного выражения, и эта проверка должна выполняться только в том случае, если строка содержит только *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» или «w d h» должно завершиться ошибкой.

Комментарии:

1. Пожалуйста, отредактируйте свой вопрос, чтобы добавить несколько примеров строк, которые должны совпадать, и строк, которые не должны (или показывать то, что вы хотите извлечь из некоторых строк, содержащих «оставшиеся» символы) (например: 12x5d 4h 9whello должны давать результаты 5d , 4h , и 9w ) или что-то подобное

Ответ №1:

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

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

 Pattern.compile("\b\d[hdwm]\b");
Matcher m = p.matcher(strToCheck);
while(m.find()){
    //matching succesful code
}
  

Ответ №2:

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

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

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

Комментарии:

1. Мне также нужно, чтобы она соответствовала, если строка содержит «1d 2h 3w», например, это (и, соответственно, другие ответы), похоже, работает только для одной комбинации за раз

2. @Slyder: В таком случае вы могли бы использовать "\b[0-9][hdwm]\b" with find() . b Соответствует границе слова. Первый вызов find() выдаст "1d" , второй "2h" и третий "3w" .

3. @slyder пожалуйста, добавьте эту информацию к вопросу

Ответ №3:

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

 Pattern p = Pattern.compile("[0-9][hdwm]");
Matcher m = p.matcher(strToCheck);
        if(m.matches()){     
            //matching succesful code
        }
  

Ответ №4:

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

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

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

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

Ответ №5:

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