#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"
withfind()
.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]$"
. Который должен совпадать только с нужными строками.