正则表达式是一种为了方便操作字符串而约定的规则.在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\\b";
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|\\B)(m+|g+)e(\\b|\\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|\\B)(m+|g+)e(\\b|\\B)";
Pattern p = Pattern.compile(input);
Matcher m = p.matcher(CONTENT);
String mCONTENT= m.replaceFirst("_TEST_CONTENT_");
Log.i("---replaceFirst()后的内容---", "replaceAll() = "+ mCONTENT);
}
运行结果: