Java - 正則表達式的運用(Pattern模式和Matcher匹配)—— 匹配中文,英文字母和數字及_長度詳解——收集資源blog

java.util.regex.Pattern   模式類:用來表示一個編譯過的正則表達式。
java.util.regex.Matcher   匹配類:用模式匹配一個字符串所表達的抽象結果。
二、先看一個簡單的例子:
需求:從字符串:{"_type":"FQDN","_oid":"51a867e4773da1128b1422ad"} 中取出這段數字:51a867e4773da1128b1422ad
沒有用過正則表達式的程序員可能分爲兩步獲取
1. 用String類的indexOf方法獲取51a867e4773da1128b1422ad的初始位置
2. 用String類的subString方法取出51a867e4773da1128b1422ad
用這種方法的缺點是代碼可閱讀性很差,即我們常說的hard code
如果用正則表達式則可以用以下的方法:
                   String reg ="[0-9A-Za-z]{24,}"; // appear at least 24 times ^[0-9A-Za-z]{24,}
                    Pattern pattern = Pattern.compile(reg);
                    Matcher matcher = pattern.matcher(str);
                    if (matcher.find()) {// matcher.matchers() {
                        String fqdnId = matcher.group();
                    }
三、一些常見的問題
1.  ^ 和 $ 他們是分別用來匹配字符串的開始和結束。(鎖定模式的應用範圍)

         "^wangsheng": 開頭一定要有"wangsheng"的字符串才能被匹配;

    "isJoshWang$": 結尾一定要由"isJoshWang"的字符串來結尾;

那麼,

  "^abc$": 就是要求以abc開頭和以abc結尾的字符串,實際上是隻有abc匹配。

 

  "notice": 匹配包含notice的字符串。

用這個兩個字符就將模式鎖定在一定範圍裏面。

 

2. Java對反斜線的處理問題:

在其他語言中,\表示要插入一個字符;

 

在Java語言中,\表示要插入正則表達式的反斜線,並且後面的字符有特殊意義。
在Java正則表達式中,如果要插入一個字符,則需要在正則表達式中寫成\\,原因是下APIDoc定義\表示一個反斜線。
但是如果在正則表示式中表示回車換行等,則不需要多添加反斜線了。比如回車r就寫作r.
3. 常用的與正則表達式相關的API
 1) Matcher.find():嘗試查找與模式匹配的字符序列的下一個子序列。此方法從字符序列的開頭開始,如果該方法的前一次調用成功了並且從那時開始 匹配器沒有被重置,則從以前匹配操作沒有匹配的第一個字符開始,即如果前一次找到與模式匹配的子序列則這次從這個子序列後開始查找。
2) Matcher.matchers():判斷整個字符序列與模式是否匹配。當連續用Matcher對象檢查多個字符串時候,可以使用
Matcher.reset():重置匹配器,放棄其所有顯式狀態信息並將其添加位置設置爲零。
或者Matcher.reset(CharSequence input)  重置此具有新輸入序列的匹配器來重複使用匹配器。
3) 組的概念,這個概念很重要,組是用括號劃分的正則表達式,可以通過編號來引用組。組號從0開始,有幾對小括號就表示有幾個組,並且組可以嵌套,組號爲0的表示整個表達式,組號爲1的表示第一個組,依此類推。
例如:A(B)C(D)E正則式中有三組,組0是ABCDE,組1是B,組2是D;
A((B)C)(D)E正則式中有四組:組0是ABCDE,組1是BC,組2是B;組3是C,組4是D。
 int groupCount():返回匹配其模式中組的數目,不包括第0組。
String group():返回前一次匹配操作(如find())的第0組。
String group(int group):返回前一次匹配操作期間指定的組所匹配的子序列。如果該匹配成功,但指定組未能匹配字符序列的任何部分,則返回 null。
int start(int group):返回前一次匹配操作期間指定的組所匹配的子序列的初始索引。
int end(int group):返回前一次匹配操作期間指定的組所匹配的子序列的最後索引+1。
4)匹配的範圍的控制
最變態的就要算lookingAt()方法了,名字很讓人迷惑,需要認真看APIDoc。
 start()  返回以前匹配的初始索引。
end()  返回最後匹配字符之後的偏移量。
 public boolean lookingAt()嘗試將從區域開頭開始的輸入序列與該模式匹配。
與 matches 方法類似,此方法始終從區域的開頭開始;與之不同的是,它不需要匹配整個區域。
如果匹配成功,則可以通過 start、end 和 group 方法獲取更多信息。
返回:當且僅當輸入序列的前綴匹配此匹配器的模式時才返回 true。
 5) Pattern標記
 Pattern類的靜態方法
static Pattern compile(String regex, int flags)
          將給定的正則表達式編譯到具有給定標誌的模式中。
其中的flags參數就是Pattern標記,這個標記在某些時候非常重要。
 Pattern.CANON_EQ
          啓用規範等價。
Pattern.CASE_INSENSITIVE
          啓用不區分大小寫的匹配。
Pattern.COMMENTS
          模式中允許空白和註釋。
Pattern.DOTALL
          啓用 dotall 模式。
Pattern.LITERAL
          啓用模式的字面值分析。
Pattern.MULTILINE
          啓用多行模式。
Pattern.UNICODE_CASE
          啓用 Unicode 感知的大小寫摺疊。
Pattern.UNIX_LINES
          啓用 Unix 行模式。 
 4. 字符串的替換
String.replace(char oldChar, char newChar)
          返回一個新的字符串,它是通過用 newChar 替換此字符串中出現的所有 oldChar 而生成的。
String.replace(CharSequence target, CharSequence replacement)
          使用指定的字面值替換序列替換此字符串匹配字面值目標序列的每個子字符串。
String.replaceAll(String regex, String replacement)
          使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的每個子字符串。
String.replaceFirst(String regex, String replacement)
          使用給定的 replacement 字符串替換此字符串匹配給定的正則表達式的第一個子字符串。
 StringBuffer.replace(int start, int end, String str)
          使用給定 String 中的字符替換此序列的子字符串中的字符。
StringBuilder.replace(int, int, java.lang.String)
          使用給定 String 中的字符替換此序列的子字符串中的字符。
 Matcher.replaceAll(String replacement)
          替換模式與給定替換字符串相匹配的輸入序列的每個子序列。
Matcher.replaceFirst(String replacement)
          替換模式與給定替換字符串匹配的輸入序列的第一個子序列。 
5、 字符串的切分
String[] split(String regex)
          根據給定的正則表達式的匹配來拆分此字符串。
 String[] split(String regex, int limit)
          根據匹配給定的正則表達式來拆分此字符串。
當然,還有一個StringTokenizer類,可以用來切分字符串,但是現在SUN已經不推薦使用了。轉變下思路,其實用正則表達式也可以達到將字符串切分爲段的目的。
6. 正則表達式最大的難點在於熟練書寫正則表達式:
構造                                匹配 字符 字符類 預定義字符類 POSIX 字符類(僅 US-ASCII) java.lang.Character 類(簡單的 java 字符類型) Unicode 塊和類別的類 邊界匹配器 Greedy 數量詞 Reluctant 數量詞 Possessive 數量詞 Logical 運算符 Back 引用 引用 特殊構造(非捕獲)
x 字符x
\ 反斜線字符
n 帶有八進制值0的字符n(0 <= n <= 7)
nn 帶有八進制值0的字符nn(0 <= n <= 7)
mnn 帶有八進制值0的字符mnn(0 <= m <= 3、0 <= n <= 7)
xhh 帶有十六進制值 0x的字符hh
uhhhh 帶有十六進制值 0x的字符hhhh
t 製表符 ('u0009')
n 新行(換行)符 ('u000A')
r 回車符 ('u000D')
f 換頁符 ('u000C')
a 報警 (bell) 符 ('u0007')
e 轉義符 ('u001B')
cx 對應於x的控制符
[abc] a、b或c(簡單類)
[^abc] 任何字符,除了a、b或c(否定)
[a-zA-Z] a到z或A到Z,兩頭的字母包括在內(範圍)
[a-d[m-p]] a到d或m到p:[a-dm-p](並集)
[a-z&&[def]] d、e或f(交集)
[a-z&&[^bc]] a到z,除了b和c:[ad-z](減去)
[a-z&&[^m-p]] a到z,而非m到p:[a-lq-z](減去)
. 任何字符(與行結束符可能匹配也可能不匹配)
d 數字:[0-9]
D 非數字:[^0-9]
s 空白字符:[ tnx0Bfr]
S 非空白字符:[^s]
w 單詞字符:[a-zA-Z_0-9]
W 非單詞字符:[^w]
p{Lower} 小寫字母字符:[a-z]
p{Upper} 大寫字母字符:[A-Z]
p{ASCII} 所有 ASCII:[x00-x7F]
p{Alpha} 字母字符:[p{Lower}p{Upper}]
p{Digit} 十進制數字:[0-9]
p{Alnum} 字母數字字符:[p{Alpha}p{Digit}]
p{Punct} 標點符號:!"#$%&'()*+,-./:;<=>?@[]^_`{|}~
p{Graph} 可見字符:[p{Alnum}p{Punct}]
p{Print} 可打印字符:[p{Graph}x20]
p{Blank} 空格或製表符:[ t]
p{Cntrl} 控制字符:[x00-x1Fx7F]
p{XDigit} 十六進制數字:[0-9a-fA-F]
p{Space} 空白字符:[ tnx0Bfr]
p{javaLowerCase} 等效於 java.lang.Character.isLowerCase()
p{javaUpperCase} 等效於 java.lang.Character.isUpperCase()
p{javaWhitespace} 等效於 java.lang.Character.isWhitespace()
p{javaMirrored} 等效於 java.lang.Character.isMirrored()
p{InGreek} Greek 塊(簡單)中的字符
p{Lu} 大寫字母(簡單類別
p{Sc} 貨幣符號
P{InGreek} 所有字符,Greek 塊中的除外(否定)
[p{L}&&[^p{Lu}]]  所有字母,大寫字母除外(減去)
^ 行的開頭
$ 行的結尾
b 單詞邊界
B 非單詞邊界
A 輸入的開頭
G 上一個匹配的結尾
Z 輸入的結尾,僅用於最後的結束符(如果有的話)
z 輸入的結尾
X? X,一次或一次也沒有
X* X,零次或多次
X+ X,一次或多次
X{n} X,恰好n
X{n,} X,至少n
X{n,m} X,至少n次,但是不超過m
X?? X,一次或一次也沒有
X*? X,零次或多次
X+? X,一次或多次
X{n}? X,恰好n
X{n,}? X,至少n
X{n,m}? X,至少n次,但是不超過m
X?+ X,一次或一次也沒有
X*+ X,零次或多次
X++ X,一次或多次
X{n}+ X,恰好n
X{n,}+ X,至少n
X{n,m}+ X,至少n次,但是不超過m
XY X後跟Y
X|Y XY
(X) X,作爲捕獲組
n 任何匹配的nth捕獲組
  Nothing,但是引用以下字符
Q Nothing,但是引用所有字符,直到E
E Nothing,但是結束從Q開始的引用
(?:X) X,作爲非捕獲組
(?idmsux-idmsux)  Nothing,但是將匹配標誌idmsux on - off
(?idmsux-idmsux:X)   X,作爲帶有給定標誌idmsux on - off
(?=X) X,通過零寬度的正 lookahead
(?!X) X,通過零寬度的負 lookahead
(?<=X) X,通過零寬度的正 lookbehind
(?<!X) X,通過零寬度的負 lookbehind
(?>X) X,作爲獨立的非捕獲組

反斜線、轉義和引用

反斜線字符 ('') 用於引用轉義構造,如上表所定義的,同時還用於引用其他將被解釋爲非轉義構造的字符。因此,表達式 \與單個反斜線匹配,而{與左括號匹配。

在不表示轉義構造的任何字母字符前使用反斜線都是錯誤的;它們是爲將來擴展正則表達式語言保留的。可以在非字母字符前使用反斜線,不管該字符是否非轉義構造的一部分。

根據Java Language Specification 的要求,Java 源代碼的字符串中的反斜線被解釋爲 Unicode 轉義或其他字符轉義。因此必須在字符串字面值中使用兩個反斜線,表示正則表達式受到保護,不被 Java 字節碼編譯器解釋。例如,當解釋爲正則表達式時,字符串字面值 "b"與單個退格字符匹配,而"\b"與單詞邊界匹配。字符串字面值"(hello)"是非法的,將導致編譯時錯誤;要與字符串(hello)匹配,必須使用字符串字面值"\(hello\)"。

字符類

字符類可以出現在其他字符類中,並且可以包含並集運算符(隱式)和交集運算符 (&&)。並集運算符表示至少包含其某個操作數類中所有字符的類。交集運算符表示包含同時位於其兩個操作數類中所有字符的類。

字符類運算符的優先級如下所示,按從最高到最低的順序排列:

1     2     3     4     5    
字面值轉義     x
分組 [...]
範圍 a-z
並集 [a-e][i-u]
交集 [a-z&&[aeiou]]

注意,元字符的不同集合實際上位於字符類的內部,而非字符類的外部。例如,正則表達式.在字符類內部就失去了其特殊意義,而表達式-變成了形成元字符的範圍。

行結束符

行結束符是一個或兩個字符的序列,標記輸入字符序列的行結尾。以下代碼被識別爲行結束符:

  • 新行(換行)符 ('n')、
  • 後面緊跟新行符的回車符 ("rn")、
  • 單獨的回車符 ('r')、
  • 下一行字符 ('u0085')、
  • 行分隔符 ('u2028') 或
  • 段落分隔符 ('u2029)。

如果激活UNIX_LINES模式,則新行符是唯一識別的行結束符。

如果未指定DOTALL標誌,則正則表達式.可以與任何字符(行結束符除外)匹配。

默認情況下,正則表達式^和$忽略行結束符,僅分別與整個輸入序列的開頭和結尾匹配。如果激活MULTILINE模式,則^在輸入的開頭和行結束符之後(輸入的結尾)才發生匹配。處於MULTILINE模式中時,$僅在行結束符之前或輸入序列的結尾處匹配。

組和捕獲

捕獲組可以通過從左到右計算其開括號來編號。例如,在表達式((A)(B(C)))中,存在四個這樣的組:

1     2     3     4    
((A)(B(C)))
A
(B(C))
(C)

組零始終代表整個表達式。

之所以這樣命名捕獲組是因爲在匹配中,保存了與這些組匹配的輸入序列的每個子序列。捕獲的子序列稍後可以通過 Back 引用在表達式中使用,也可以在匹配操作完成後從匹配器獲取。

與組關聯的捕獲輸入始終是與組最近匹配的子序列。如果由於量化的緣故再次計算了組,則在第二次計算失敗時將保留其以前捕獲的值(如果有的話)例如,將字符串"aba"與表達式(a(b)?)+相匹配,會將第二組設置爲"b"。在每個匹配的開頭,所有捕獲的輸入都會被丟棄。

以(?)開頭的組是純的非捕獲組,它不捕獲文本,也不針對組合計進行計數。

Unicode 支持

此類符合Unicode Technical Standard #18:Unicode Regular Expression Guidelines 第 1 級和 RL2.1 Canonical Equivalents。

Java 源代碼中的 Unicode 轉義序列(如 u2014)是按照 Java Language Specification 的 第 3.3 節中的描述處理的。這樣的轉義序列還可以由正則表達式解析器直接實現,以便在從文件或鍵盤擊鍵讀取的表達式中使用 Unicode 轉義。因此,可以將不相等的字符串 "u2014"和"\u2014"編譯爲相同的模式,從而與帶有十六進制值0x2014的字符匹配。

與 Perl 中一樣,Unicode 塊和類別是使用 p和P構造編寫的。如果輸入具有屬性prop,則與p{prop}匹配,而輸入具有該屬性時與P{prop}不匹配。塊使用前綴In指定,與在InMongolian中一樣。可以使用可選前綴Is指定類別:p{L}和p{IsL} 都表示 Unicode 字母的類別。塊和類別在字符類的內部和外部都可以使用。

受支持的類別是由Character類指定版本中的The Unicode Standard 的類別。類別名稱是在 Standard 中定義的,即標準又豐富。Pattern所支持的塊名稱是UnicodeBlock.forName所接受和定義的有效塊名稱。

行爲類似 java.lang.Character boolean 是 methodname方法(廢棄的類別除外)的類別,可以通過相同的p{prop}語法來提供,其中指定的屬性具有名稱javamethodname

與 Perl 5 相比較

Pattern 引擎用有序替換項執行傳統上基於 NFA 的匹配,與 Perl 5 中進行的相同。

此類不支持 Perl 構造:

  • 條件構造(?{X})和(?(condition)X|Y)、

  • 嵌入式代碼構造(?{code})和(??{code})、

  • 嵌入式註釋語法(?#comment)和

  • 預處理操作lu、L和U。

此類支持但 Perl 不支持的構造:

  • Possessive 數量詞,它可以儘可能多地進行匹配,即使這樣做導致所有匹配都成功時也如此。

  • 字符類並集和交集,如上文所述。

與 Perl 的顯著不同點是:

  • 在 Perl 中,1到9 始終被解釋爲 Back 引用;如果至少存在多個子表達式,則大於 9 的反斜線轉義數按 Back 引用對待,否則在可能的情況下,它將被解釋爲八進制轉義。在此類中,八進制轉義必須始終以零開頭。在此類中,1到9 始終被解釋爲 Back 引用,較大的數被接受爲 Back 引用,如果在正則表達式中至少存在多個子表達式的話;否則,解析器將刪除數字,直到該數小於等於組的現有數或者其爲一個數字。

  • Perl 使用 g標誌請求恢復最後匹配丟失的匹配。此功能是由Matcher類顯式提供的:重複執行find方法調用可以恢復丟失的最後匹配,除非匹配器被重置。

  • 在 Perl 中,位於表達式頂級的嵌入式標記對整個表達式都有影響。在此類中,嵌入式標誌始終在它們出現的時候才起作用,不管它們位於頂級還是組中;在後一種情況下,與在 Perl 中類似,標誌在組的結尾處還原。

  • Perl 允許錯誤匹配構造,如在表達式 *a中,以及不匹配的括號,如在在表達式abc] 中,並將其作爲字面值對待。此類還接受不匹配的括號,但對 +、? 和 * 不匹配元字符有嚴格限制;如果遇到它們,則拋出PatternSyntaxException


匹配中文:[\u4e00-\u9fa5] 
英文字母:[a-zA-Z] 
數字:[0-9] 

匹配中文,英文字母和數字及_: 
^[\u4e00-\u9fa5_a-zA-Z0-9]+$

同時判斷輸入長度:
[\u4e00-\u9fa5_a-zA-Z0-9_]{4,10}

^[\w\u4E00-\u9FA5\uF900-\uFA2D]*$ 1、一個正則表達式,只含有漢字、數字、字母、下劃線不能以下劃線開頭和結尾:
^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$  其中:
^  與字符串開始的地方匹配
(?!_)  不能以_開頭
(?!.*?_$)  不能以_結尾
[a-zA-Z0-9_\u4e00-\u9fa5]+  至少一個漢字、數字、字母、下劃線
$  與字符串結束的地方匹配

放在程序裏前面加@,否則需要\\進行轉義 @"^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$"
(或者:@"^(?!_)\w*(?<!_)$"    或者  @" ^[\u4E00-\u9FA50-9a-zA-Z_]+$ "  )

2、只含有漢字、數字、字母、下劃線,下劃線位置不限:
^[a-zA-Z0-9_\u4e00-\u9fa5]+$

3、由數字、26個英文字母或者下劃線組成的字符串
^\w+$

4、2~4個漢字
@"^[\u4E00-\u9FA5]{2,4}$"; 

5、
^[\w-]+(\.[\w-]+)*@[\w-]+(\.[\w-]+)+$

用:(Abc)+    來分析:  XYZAbcAbcAbcXYZAbcAb

XYZAbcAbcAbcXYZAbcAb6、
[^\u4E00-\u9FA50-9a-zA-Z_]
34555#5' -->34555#5'

[\u4E00-\u9FA50-9a-zA-Z_]    eiieng_89_   --->   eiieng_89_
_';'eiieng_88&*9_    -->  _';'eiieng_88&*9_
_';'eiieng_88_&*9_  -->  _';'eiieng_88_&*9_

public  bool RegexName(string str)
{
bool flag=Regex.IsMatch(str,@"^[a-zA-Z0-9_\u4e00-\u9fa5]+$");
return  flag;
}

Regex   reg=new   Regex("^[a-zA-Z_0-9]+$");   
if(reg.IsMatch(s))   
{   
\\符合規則   
}   
else   
{   
\\存在非法字符   
}

最長不得超過7個漢字,或14個字節(數字,字母和下劃線)正則表達式
^[\u4e00-\u9fa5]{1,7}$|^[\dA-Za-z_]{1,14}$

常用正則表達式大全!(例如:匹配中文、匹配html)
匹配中文字符的正則表達式: [u4e00-u9fa5]   
評註:匹配中文還真是個頭疼的事,有了這個表達式就好辦了 
匹配雙字節字符(包括漢字在內):[^x00-xff] 
評註:可以用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1) 
匹配空白行的正則表達式:ns*r 
評註:可以用來刪除空白行 
匹配HTML標記的正則表達式:<(S*?)[^>]*>.*?|<.*? /> 
評註:網上流傳的版本太糟糕,上面這個也僅僅能匹配部分,對於複雜的嵌套標記依舊無能爲力 
匹配首尾空白字符的正則表達式:^s*|s*$ 
評註:可以用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),非常有用的表達式 
匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 
評註:表單驗證時很實用 
匹配網址URL的正則表達式:[a-zA-z]+://[^s]* 
評註:網上流傳的版本功能很有限,上面這個基本可以滿足需求 
匹配帳號是否合法(字母開頭,允許5-16字節,允許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 
評註:表單驗證時很實用 
匹配國內電話號碼:d{3}-d{8}|d{4}-d{7} 
評註:匹配形式如 0511-4405222 或 021-87888822 
匹配騰訊QQ號:[1-9][0-9]{4,} 
評註:騰訊QQ號從10000開始 
匹配中國郵政編碼:[1-9]d{5}(?!d) 
評註:中國郵政編碼爲6位數字 
匹配身份證:d{15}|d{18} 
評註:中國的身份證爲15位或18位 
匹配ip地址:d+.d+.d+.d+ 
評註:提取ip地址時有用 
匹配特定數字: 
^[1-9]d*$    //匹配正整數 
^-[1-9]d*$   //匹配負整數 
^-?[1-9]d*$   //匹配整數 
^[1-9]d*|0$  //匹配非負整數(正整數 + 0) 
^-[1-9]d*|0$   //匹配非正整數(負整數 + 0) 
^[1-9]d*.d*|0.d*[1-9]d*$   //匹配正浮點數 
^-([1-9]d*.d*|0.d*[1-9]d*)$  //匹配負浮點數 
^-?([1-9]d*.d*|0.d*[1-9]d*|0?.0+|0)$  //匹配浮點數 
^[1-9]d*.d*|0.d*[1-9]d*|0?.0+|0$   //匹配非負浮點數(正浮點數 + 0) 
^(-([1-9]d*.d*|0.d*[1-9]d*))|0?.0+|0$  //匹配非正浮點數(負浮點數 + 0) 
評註:處理大量數據時有用,具體應用時注意修正 
匹配特定字符串: 
^[A-Za-z]+$  //匹配由26個英文字母組成的字符串 
^[A-Z]+$  //匹配由26個英文字母的大寫組成的字符串 
^[a-z]+$  //匹配由26個英文字母的小寫組成的字符串 
^[A-Za-z0-9]+$  //匹配由數字和26個英文字母組成的字符串 
^w+$  //匹配由數字、26個英文字母或者下劃線組成的字符串 
在使用RegularExpressionValidator驗證控件時的驗證功能及其驗證表達式介紹如下: 
只能輸入數字:“^[0-9]*$” 
只能輸入n位的數字:“^d{n}$” 
只能輸入至少n位數字:“^d{n,}$” 
只能輸入m-n位的數字:“^d{m,n}$” 
只能輸入零和非零開頭的數字:“^(0|[1-9][0-9]*)$” 
只能輸入有兩位小數的正實數:“^[0-9]+(.[0-9]{2})?$” 
只能輸入有1-3位小數的正實數:“^[0-9]+(.[0-9]{1,3})?$” 
只能輸入非零的正整數:“^+?[1-9][0-9]*$” 
只能輸入非零的負整數:“^-[1-9][0-9]*$” 
只能輸入長度爲3的字符:“^.{3}$” 
只能輸入由26個英文字母組成的字符串:“^[A-Za-z]+$” 
只能輸入由26個大寫英文字母組成的字符串:“^[A-Z]+$” 
只能輸入由26個小寫英文字母組成的字符串:“^[a-z]+$” 
只能輸入由數字和26個英文字母組成的字符串:“^[A-Za-z0-9]+$” 
只能輸入由數字、26個英文字母或者下劃線組成的字符串:“^w+$” 
驗證用戶密碼:“^[a-zA-Z]w{5,17}$”正確格式爲:以字母開頭,長度在6-18之間, 
只能包含字符、數字和下劃線。 
驗證是否含有^%&',;=?$"等字符:“[^%&',;=?$x22]+” 
只能輸入漢字:“^[u4e00-u9fa5],{0,}$” 
驗證Email地址:“^w+[-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*$” 
驗證InternetURL:“^http://([w-]+.)+[w-]+(/[w-./?%&=]*)?$” 
驗證電話號碼:“^((d{3,4})|d{3,4}-)?d{7,8}$” 
正確格式爲:“XXXX-XXXXXXX”,“XXXX-XXXXXXXX”,“XXX-XXXXXXX”, 
“XXX-XXXXXXXX”,“XXXXXXX”,“XXXXXXXX”。 
驗證身份證號(15位或18位數字):“^d{15}|d{}18$” 
驗證一年的12個月:“^(0?[1-9]|1[0-2])$”正確格式爲:“01”-“09”和“1”“12” 
驗證一個月的31天:“^((0?[1-9])|((1|2)[0-9])|30|31)$” 
正確格式爲:“01”“09”和“1”“31”。 
匹配中文字符的正則表達式: [u4e00-u9fa5] 
匹配雙字節字符(包括漢字在內):[^x00-xff] 
匹配空行的正則表達式:n[s| ]*r 
匹配HTML標記的正則表達式:/<(.*)>.*|<(.*) />/ 
匹配首尾空格的正則表達式:(^s*)|(s*$) 
匹配Email地址的正則表達式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)* 
匹配網址URL的正則表達式:http://([w-]+.)+[w-]+(/[w- ./?%&=]*)? 
(1)應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1) 
String.prototype.len=function(){return this.replace([^x00-xff]/g,"aa").length;} 
(2)應用:javascript中沒有像vbscript那樣的trim函數,我們就可以利用這個表達式來實現 
String.prototype.trim = function() 

return this.replace(/(^s*)|(s*$)/g, ""); 

(3)應用:利用正則表達式分解和轉換IP地址 
function IP2V(ip) //IP地址轉換成對應數值 

re=/(d+).(d+).(d+).(d+)/g //匹配IP地址的正則表達式 
if(re.test(ip)) 

return RegExp.$1*Math.pow(255,3))+RegExp.$2*Math.pow(255,2))+RegExp.$3*255+RegExp.$4*1 

else 

throw new Error("Not a valid IP address!") 


(4)應用:從URL地址中提取文件名的javascript程序 
s="http://www.juapk.com/forum.php"; 
s=s.replace(/(.*/){0,}([^.]+).*/ig,"$2") ;//Page1.htm 
(5)應用:利用正則表達式限制網頁表單裏的文本框輸入內容 
用正則表達式限制只能輸入中文:οnkeyup="value=value.replace(/[^u4E00-u9FA5]/g,') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^u4E00-u9FA5]/g,'))" 
用正則表達式限制只能輸入全角字符:onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^uFF00-uFFFF]/g,'))" 
用正則表達式限制只能輸入數字:οnkeyup="value=value.replace(/[^d]/g,') "onbeforepaste= "clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,'))" 
用正則表達式限制只能輸入數字和英文:οnkeyup="value=value.replace(/[W]/g,') "onbeforepaste="clipboardData.setData('text',clipboardData.getData('text').replace(/[^d]/g,'


簡單例子
public static void main(String[] args) {
    String patternStr = "\u300a.+\u300b";
    Pattern pattern = Pattern.compile(patternStr);
    String input = "《21世紀》記者";
    Matcher matcher = pattern.matcher(input);
    if (matcher.find()) {
      int start = matcher.start();
      int end = matcher.end();
      System.out.println(input.substring(start, end));
    }else{
      System.out.println("not found");
    }
    //output: 《21世紀》
  }

1.java驗證IP地址:

Pattern pattern = Pattern.compile(“\\b((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\.((?!\\d\\d\\d)\\d+|1\\d\\d|2[0-4]\\d|25[0-5])\\b”);

Matcher matcher = pattern.matcher(“127.400.600.2″); //以驗證127.400.600.2爲例

System.out.println(matcher.matches());

2. java驗證日期時間,解決潤月:

Pattern pattern = Pattern.compile(“^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$”);

Matcher matcher = pattern.matcher(“2000-02-29 23:59:59″);

System.out.println(matcher.matches());

 

3.java驗證郵箱格式:

Pattern pattern = Pattern.compile(“^([a-zA-Z0-9_\\-\\.]+)@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.)|(([a-zA-Z0-9\\-]+\\.)+))([a-zA-Z]{2,4}|[0-9]{1,3})(\\]?)$”);

Matcher matcher = pattern.matcher(“[email protected]”);

System.out.println(matcher.matches());




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章