你要注意到最后一个替换所用变量$1所代表的内容与第二个$1一样为"256",而不是预期的"78",因为在替换进行中,替换变量$1只根据匹配内容进行了两次更新,最后一次就使第二次匹配时所更新的结果,那么我们可以由此知道,如果numInterpolations设为1,那么结果将是:
Tank a123- 85 Tank a123- 32 Tank a123- 22
3.应用示例:
刚好前段时间公司准备出一个《伊索预言》的英语学习互动教材,其中有电子档资料的整理工作,我们就以此为例来看一下Jakarta-ORO与JDBC2.0 API结合起来对数据库内的资料进行简单提取与整理的实现。假设由录入部的同事送过来的存放在MS SQLSERVER 7数据库里的电子档的表结构如下(注:或许在不同的DBMS中有相应的正则表达式的应用,但这不在本文讨论范围内):
表名:AESOP, 表中每条记录包含有三列:
ID(int):单词索引号
WORD(varchar):单词
CONTENT(varchar):存放单词的相关解释与例句等内容
其中CONTENT列中内容的格式如下:
[音标] [词性] (解释){(例句一/例句解释/例句中该词的词性: 单词在句中的意思) (例句二/例句解释/例句中该词的词性: 单词在句中的意思)}
如对应单词Kevin,CONTENT中的内容如下:
['kevin] [名词](人名凯文){(Kevin loves comic./凯文爱漫画/名词: 凯文)( Kevin is living in ZhuHai now./凯文现住在珠海/名词: 凯文)}
我们的例子主要针对CONTENT列中内容进行字符串处理。
★查找单个匹配:
首先,让我们尝试把CONTNET列中的[音标]字段的内容列示出来,由于所有单词的记录中都有这一项并且都在字串开始位置,所以这个查找工作比较简单:
1、确定相应的正则表达式:/[[^]]+/]
这个是很简单的正则表达式,其意思是要求相匹配的字符串必须为以一对中括号包含的所有内容,如['kevin] 、[名词]等,但内容中不包括"]"符号,也就是要避免出现"[][]"会作为一个匹配对象的情况出现(有关正则表达式的基础知识请参照有关资料,这里不再详述)。
注意,在Java中,你必须对每一个向前的斜杠("https://www.jb51.net/")进行转义处理。所以我们要在上面的正则表达式里每个"https://www.jb51.net/"前面加上一个"https://www.jb51.net/"以免出现编译错误,也就是在JAVA中初始化正则表达式的字符串的语句应该为:
String restring=" //[[^]]+//]";
并且在表达式里每个符号中间不能有空格,否则就会同样出现编译错误。
2、实例化PatternCompiler对象,创建Pattern对象
PatternCompiler compiler=new Perl5Compiler();
Pattern pattern=compiler.compile(restring);
3、创建PatternMatcher对象,调用PatternMatcher接口的contain()方法检查匹配情况:
PatternMatcher matcher=new Perl5Matcher(); if (matcher.contains(content,pattern)) { //处理代码片段 }
这里matcher.contains(content,pattern)中的参数 content是从数据库里取来的字符串变量。该方法只会查到第一个匹配的对象字符串,但是由于音标项均在CONETNET内容字符串中的起始位置,所以用这个方法就已经可以保证把每条记录里的音标项找出来了,但更为直接与合理的办法是使用boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)方法,该方法验证目标字符串是否以正则表达式所匹配的字串为起始。
具体实现的完整的程序代码如下:
package RegularExpressions; //import…… import org.apache.oro.text.regex.*; //使用Jakarta-ORO正则表达式库前需要把它加到CLASSPATH里面,如果用IDE是//JBUILDER,那么也可以在JBUILDER里直接自建新库。 public class yisuo { public static void main(String[] args) { try { //使用JDBC DRIVER进行DBMS连接,这里我使用的是一个第三方JDBC //DRIVER,Microsoft本身也有一个面向SQLSERVER7/2000的免费JDBC //DRIVER,但其性能真的是奇差,不用也罢。 Class.forName("com.jnetdirect.jsql.JSQLDriver"); Connection con = DriverManager.getConnection("jdbc:JSQLConnect://kevin:1433", "kevin chen", "re"); Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); //为使用Jakarta-ORO库而创建相应的对象 String rsstring = " //[[^]]+//]"; PatternCompiler orocom = new Perl5Compiler(); Pattern pattern = orocom.compile(rsstring); PatternMatcher matcher = new Perl5Matcher(); ResultSet uprs = stmt.executeQuery("SELECT * FROM aesop"); while (uprs.next()) { Stirng word = uprs.getString("word"); Stirng content = uprs.getString("content"); if (matcher.contains(content, pattern)) { //或if(matcher.matchesPrefix(content,pattern)){ MatchResult result = matcher.getMatch(); Stirng pure = result.toString(); System.out.println(word + "的音标为:" + pure); } } } catch (Exception e) { System.out.println(e); } } }
输出结果为:kevin的音标为['kevin]