在某些时候我们想要查找一个样式的字符串,比如email,姓名,某些产品的编号。一般暴力的方法是你吧所有可能的形式都存一下,然后再对每个串一一匹配。但是往往满足要求的数据太过于海量让我们无法应对。但是已经有强者完成了我们想法。创造出来了这么个东西。这是java上
本文是非常简单的讲解,毫无深度。
正则表达式的元字符(使用百度百科的表格)先看下面有根据需要看表
但是我们平常实际上用的不是太多。我们来了解基本的几个
方法:
[ ]表示或比如我们把几个元字符加入其中[A-Za-z0-9-_]就表示大写字母或者小写字母、或者0-9数字,或者-,或者_(不一定要上表元字符,你自己其他的单个字符也没有问题)
[^]表示匹配的位置是不是方括号里面的东西
( )这是一个圆括号将里面包含的满足匹配的数都放入group,我们再讲group中满足要求的数字取出来即可
量:
*表示前一个字符出现0次或多次
+表示前一个字符出现1次或多次
?表示前一个字符出现0次或一次。加在其他量面前表示非贪婪模式何为贪婪模式见上表
{n}表示前一个字符恰出现n次
{n,}表示前一个字符出现次数大于n次
{n,m}表示前一个字符出现n-m次
同时使用时我们要依靠两个类
Patten和Matcher
看一下
Matcher类
类匹配器
- java.lang.Object继承
-
- java.util.regex.Matcher中
-
- 所有已实现的接口:
- 的MatchResult
- 方法
那么我们看一看实际应用吧
String regex="[^A-Za-z0-9_-]@([A-Za-z0-9_-]*)";//这是我们的正则表达式目的是获取@后的人名。本问题中@生效的条件是@是非数字,非字母,非下划线,非分隔符。名字是字母数字下划线字母,*表示多个
Pattern p=Pattern.compile(regex);//这里相当于解析正则表达式
for(int i = 0; i < tweets.size();i++)
{
Matcher m=p.matcher(tweets.get(i).getText());//这里匹配我们的内容tweets.get(i).getText()是String类型的一段文字
while(m.find()){ //在有匹配的情况下
for(int j = 1;j < m.groupCount()+1;j++) //所有匹配数
{
nameList.add(m.group(j).toLowerCase());//return the String with lowercase//得到所有的匹配数m.group(j)得到第j个匹配串
}
}