正则expression式在String.matches()中不起作用
我有这一小段代码
String[] words = {"{apf","hum_","dkoe","12f"}; for(String s:words) { if(s.matches("[az]")) { System.out.println(s); } }
应该打印
dkoe
但它没有打印!
欢迎来到Java错误的.matches()
方法…它会尝试并匹配所有的input。 不幸的是,其他语言也纷纷效仿
如果您想查看正则expression式是否匹配input文本,请使用Matcher
的Pattern
, Matcher
和.find()
方法:
Pattern p = Pattern.compile("[az]"); Matcher m = p.matcher(inputstring); if (m.find()) // match
如果你想知道input是否只有小写字母,你可以使用.matches()
,但是你需要匹配一个或多个字符:在你的字符类中附加一个+
,如[az]+
。 或者使用^[az]+$
和.find()
。
[az]
匹配a和z之间的单个字符。 所以,如果你的string只是"d"
,例如,那么它将匹配并被打印出来。
您需要将您的正则expression式更改为[az]+
以匹配一个或多个字符。
java的正则expression式的实现尝试匹配整个string
这不同于perl正则expression式,它试图find匹配的部分
如果要查找除小写字符以外的string,请使用模式[az]+
如果要查找包含至less一个小写字符的string,请使用该模式.*[az].*
String.matches
返回整个string是否匹配正则expression式,而不是任何子string。
用过的
String[] words = {"{apf","hum_","dkoe","12f"}; for(String s:words) { if(s.matches("[az]+")) { System.out.println(s); } }
我曾经遇到同样的问题:
Pattern ptr = Pattern.compile("^[a-zA-Z][\\']?[a-zA-Z\\s]+$");
以上失败!
Pattern ptr = Pattern.compile("(^[a-zA-Z][\\']?[a-zA-Z\\s]+$)");
以上(
和)
内的模式工作。
您的正则expression式[az]
与dkoe
不匹配,因为它只匹配长度为1的string。使用类似[az]+
string。
您可以通过执行以下操作来使模式不区分大小写:
Pattern p = Pattern.compile("[az]+", Pattern.CASE_INSENSITIVE);