本篇只讲述JAVA正则表达式类java.util.regex的取字符串的使用方法,关于正则表达式的语法及使用不在本篇的描述之中,若有需要可参看《正则表达式30分钟入门教程》。
首先做完范例需要一个待解析字符串,这里顺带把最近一个项目中的jdbcUrl拿来解析好了,字符串如下
1 | jdbc:mysql://127.0.0.1:3306/test |
这里说下目标需求,即把这段jdbcUrl分解成IP(127.0.0.1)、端口号(3306)以及数据库名(test),现将Java中的操作分为以下几步:
①书写正则表达式
正则表达式分别如下:
IP:(?<=//).*(?=:)取”//”和” :”之间的内容
PORT:(?<=\d:).*(?=/)取”数字+:”和” /”之间的内容
DBNAME:(?<=\d/).*”)取”数字+/”后面的内容
这里用正则表达式测试工具可以实时看到效果。
②JAVA中生成一个Pattern,同时预编译生成正则表达式匹配模式
1 2 3 | Pattern patternDbIp = Pattern.compile("(?<=//).*(?=:)");; Pattern patternDbPort = Pattern.compile("(?<=\\d:).*(?=/)"); Pattern patternDbName = Pattern.compile("(?<=\\d/).*"); |
首先创建匹配给定输入与此模式的匹配器,使用compild()方法将给定的正则表达式编译到模式中。
这里注意需要把\d换成\\d 否特殊字符转义则会出现 Invalid escape sequence (valid ones are \b \t \n \f \r \” \’ \\ ) 错误
③创建Matcher匹配器并匹配出目标内容
代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 | String jdbcUrl = "jdbc:mysql://127.0.0.1:3306/test"; Matcher mDbIp = patternDbIp.matcher(jdbcUrl); mDbIp.find(); String dbIP = mDbIp.group()); Matcher mDbPort = patternDbPort.matcher(jdbcUrl); mDbPort.find(); String dbPort = mDbPort.group(); Matcher mDbName = patternDbName.matcher(jdbcUrl); mDbName.find(); String dbName = mDbName.group(); |
通过调用模式的 matcher()方法从模式创建匹配器,并通过Matcher的find()方法扫描输入序列以查找与该模式匹配的下一个子序列。
最后调用group()方法返回由以前匹配操作所匹配的输入子序列,即本例中的目标字符串。
以上即完成了使用正则表达式取目标字符串的使用,关于对字符串的判定,如IP地址违规判定,我们后续开篇。
本篇到此,谢谢关注。
BeiTown
2014-06-02