我正在尝试检查带有正则表达式的字符串,并且只有在字符串仅包含* 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”之类的字母应该会失败。
答案 0 :(得分:3)
使用m.matches()
或将^
和$
添加到正则表达式的开头和结尾。
编辑,但如果您想要通过空格分隔的这些序列(如评论中所述),您可以使用
Pattern.compile("\\b\\d[hdwm]\\b");
Matcher m = p.matcher(strToCheck);
while(m.find()){
//matching succesful code
}
答案 1 :(得分:2)
首先,我认为您应该使用matches()
代替find()
。前者将整个字符串与正则表达式匹配,而后者在字符串中搜索。
其次,您可以像这样简化正则表达式:"[0-9][hdwm]"
。
最后,如果号码可以包含多个数字,请使用+
运算符:"[0-9]+[hdwm]"
答案 2 :(得分:1)
试试这个:
Pattern p = Pattern.compile("[0-9][hdwm]");
Matcher m = p.matcher(strToCheck);
if(m.matches()){
//matching succesful code
}
答案 3 :(得分:1)
如果您只想接受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()
。)
答案 4 :(得分:0)
您可以像"^\\d+[hdwm]$"
一样编写它。哪个应该只匹配所需的字符串。