String sqlStr = "select count(*) from table where a = @{1} and b = @{2} and c =@{3}";
String regex = "select\\s+count\\((\\*|[a-zA-z1-9.]+)\\)\\s+from.*";
//判断是否匹配
boolean matches = sqlStr.matches(regex);
if (!matches) {
System.out.println("sql format error");
}
//匹配占位符个数
regex = "\\@\\{\\d+\\}";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(sqlStr);
int i = 0;
while (matcher.find()) {
i++;
System.out.println(matcher.group());
System.out.println(matcher.start());
System.out.println(matcher.end());
}
i = 0;
while (matcher.find(i)) {
System.out.println(i + "====" + matcher.group());
i++;
}
Pattern类常用方法:
1.Pattern.matcher(String regex,CharSequence input)
是一个静态方法,用于快速匹配字符串,该方法适合用于只匹配一次,且匹配全部字符串.
Pattern.matches("\\d+","2223");//返回true
Pattern.matches("\\d+","2223aa");//返回false,需要匹配到所有字符串才能返回true,这里aa不能匹配到
Pattern.matches("\\d+","22bb23");//返回false,需要匹配到所有字符串才能返回true,这里bb不能匹配到
2.Pattern.matcher(CharSequence input)
Pattern.matcher(CharSequence input)返回一个Matcher对象.
Matcher类的构造方法也是私有的,不能随意创建,只能通过Pattern.matcher(CharSequence input)方法得到该类的实例.
Pattern类只能做一些简单的匹配操作,要想得到更强更便捷的正则匹配操作,那就需要将Pattern与Matcher一起合作.Matcher类提供了对正则表达式的分组支持,以及对正则表达式的多次匹配支持.
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
Matcher类常用方法:
1.Matcher.matches()
matches()对整个字符串进行匹配,只有整个字符串都匹配了才返回true
Pattern p=Pattern.compile("\\d+");
Matcher m=p.matcher("22bb23");
m.matches();//返回false,因为bb不能被\d+匹配,导致整个字符串匹配未成功.
Matcher m2=p.matcher("2223");
m2.matches();//返回true,因为\d+匹配到了整个字符串
2.Matcher.find()
find()对字符串进行匹配(不必全部匹配,有部分匹配则返回true),匹配到的字符串可以在任何位置. find()方法是从前往后遍历的进兴匹配,返回是否匹配到,当find()方法返回true时,可以通过group()方法获取当前组匹配到的值;同时每次使用find后,可以使用start(),end(),group()返回匹配到的子字符串的位置以及详细信息。
start()返回匹配到的子字符串在字符串中的索引位置.
end()返回匹配到的子字符串的最后一个字符在字符串中的索引位置.
group()返回匹配到的子字符串
注意:只有当匹配操作成功,才可以使用start(),end(),group()三个方法,否则会抛出java.lang.IllegalStateException,也就是当matches(),lookingAt(),find()其中任意一个方法返回true时,才可以使用.
3.关于group()相关用法
Pattern p = Pattern.compile("(\\d+,)(\\d+)");
String s = "123,456-34,345-123,54385";
Matcher m = p.matcher(s);
while (m.find())
{
System.out.println("m.group():" + m.group()); //打印一个大组
System.out.println("m.group(1):" + m.group(1)); //打印组1
System.out.println("m.group(2):" + m.group(2)); //打印组2
System.out.println();
}
System.out.println("捕获个数:groupCount()=" + m.groupCount());