在某些時候我們想要查找一個樣式的字符串,比如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個匹配串
}
}