Java常用的几个正则方法|查找索引,匹配,替换

Java常用的几个正则方法|查找索引,匹配,替换

正则表达式是一种为了方便操作字符串而约定的规则.在PHP,JAVA等很多主流语言都有正则的使用.最常见的用法莫过于查找,替换和匹配.下面作为简单的总结,通过用简单的例子,记录下常用的几个方法.


关于正则如何使用,就不解释了,因为网上也能找到非常多的相关资料可以看.这里只将几个常用的方法总结:

查找索引

通过关键字符串,去在目标内容中去匹配查找它的位置,这应该是最常见的用法. String类也同样提供了indexOf() 方法去实现相同的效果.但indexOf()只能从开头的位置或者特定位置去查找 ,并且只能超找一次,并不像正则的start()方法能将所有索引位置都找出来, indexOf()要配合循环才能实现这样的效果.

private static final String CONTENT = "Nineteen US-listed Chinese companies including Yanzhou Coal Mining Co, "+ "Youku Tudou Inc and cosmetic e-commerce Jumei International Holding jumped by more than 10 percent on "+ "Wednesday, compared to a 0.15 percent advance in the Dow Jones Industrial Average.";/** * 查找字符串位置 * 在格式为"XXing" (注意"ing"前面跟字符串,后面是不跟字符串的) 的字符串中寻找字符串"ing"的开始和结束位置 */private void findIndex(){String input = "Bing";Pattern p = Pattern.compile(input);Matcher m = p.matcher(CONTENT);while(m.find()){Log.i("---开始的位置---", "m.start() = "+m.start());Log.i("---结束的位置---", "m.start() = "+m.end());}}

运行结果:



匹配

find() 方法用于匹配内容中是否包含所要匹配查找的字符串,如果包含,则返回true, 否则返回false.

matches() 方法用于匹配内容字符串是否和所要匹配的字符串完全匹配相同.相同则返回true, 否则返回false.

当然,find() 同样用String类的indexOf() 也能实现,如果indexOf() 返回的索引位置值小于0,则代表不包含这个元素(或字符串), 大于等于 则表示包含. 至于matches() 用equals() 方法也能实现.

/** * 查找是否包含某个字符串 */private void findIndexs(){String input = "Holding";Pattern p = Pattern.compile(input);Matcher m = p.matcher(CONTENT);Log.i("---findIndexs()后---", "findIndexs ---> m.find() = "+ m.find());//从索引号为10的元素位置开始匹配Log.i("---findIndexs()后---", "findIndexs ---> m.find(10) = "+ m.find(10));Log.i("---findIndexs()后---", "findIndexs ---> m.matches() = "+ m.matches());}

运行结果:



替换

经常也会碰到这样的情景: 面对一大段字符串,比如html代码, 我们想去过滤替换某些字符串,正则是最好的结局方法.因为这样就能避免写一大堆代码去实现比较复杂的过滤逻辑.

比如,在字符串"aababaaaab"这样的字符串中,需要将b以及b前面的一个或几个a所组成的字符串替换成特定的字符串"test",如果不用正则. 用String类提供的方法去做,逻辑大概就是在一个循环里面,先找出所有b的位置,然后根据各个b的索引位置去切割替换它们,在代码上就写起来就一堆代码了. 但是正则就不需要这么复杂, 比如找出所有满足这个规则"b以及b前面的那些字符串" 就能用 (a+b)来表示了. 下面这个例子,就能很好的解决这种替换情景的问题.

/** * 替换字符串 */private void replaceAll(){String input = "(|B)(m+|g+)e(|B)";Pattern p = Pattern.compile(input);Matcher m = p.matcher(CONTENT);String mCONTENT= m.replaceAll("_TEST_CONTENT_");Log.i("---replaceAll()后的内容---", "replaceAll() = "+ mCONTENT);}/** * 只替换首次匹配到的字符串 */private void replaceFirst(){String input = "(|B)(m+|g+)e(|B)";Pattern p = Pattern.compile(input);Matcher m = p.matcher(CONTENT);String mCONTENT= m.replaceFirst("_TEST_CONTENT_");Log.i("---replaceFirst()后的内容---", "replaceAll() = "+ mCONTENT);}

运行结果:

推荐阅读