如果选中的字符串仍然有剩余字符,如何使正则表达式匹配失败?

时间:2011-10-20 13:57:49

标签: java regex

我正在尝试检查带有正则表达式的字符串,并且只有在字符串仅包含* 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”之类的字母应该会失败。

5 个答案:

答案 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]$"一样编写它。哪个应该只匹配所需的字符串。