首先咱們先來作一道題目:判斷一個字符串是否由數字組成。代碼示例以下:html
1 public class Test { 2 public static void main(String[] args) { 3 4 String str="5201314"; 5 char[] chars = str.toCharArray(); 6 boolean flag=true; 7 for (int i=0;i<chars.length;i++){ 8 if (chars[i]<'0'||chars[i]>'9'){ 9 flag=false; 10 } 11 } 12 if (flag){ 13 System.out.println("是由數字組成的字符串!"); 14 }else{ 15 System.out.println("不是由數字組成的字符串!"); 16 } 17 } 18 }
經過這個例子能夠發現,這種寫法很輕鬆就能夠得出想要的結果,可是若是咱們要判斷更加複雜一點的語句就麻煩了,如電話號碼、電子郵箱、網址等。再用這種方式完成就須要寫不少的代碼,這樣就使得代碼的可讀性下降了。而若是使用正則表達式來匹配就會簡潔不少,因此下面咱們來學習Java正則表達式的使用。java
正則表達式的英文叫Regular Expression,在代碼中常簡寫爲regex、regexp等。它是對字符串操做的一種邏輯公式,就是用事先定義好的一些特定字符、及這些特定字符的組合,組成一個「規則字符串」,這個「規則字符串」用來表達對字符串的一種過濾邏輯。python
上面介紹了正則,接下來咱們來學習正則表達式的語法。參考:https://www.runoob.com/java/java-regular-expressions.html正則表達式
在其餘語言中,\\ 表示:我想要在正則表達式中插入一個普通的(字面上的)反斜槓,請不要給它任何特殊的意義。express
在 Java 中,\\ 表示:我要插入一個正則表達式的反斜線,因此其後的字符具備特殊的意義。app
因此,在其餘的語言中(如Perl),一個反斜槓 \ 就足以具備轉義的做用,而在 Java 中正則表達式中則須要有兩個反斜槓才能被解析爲其餘語言中的轉義做用。也能夠簡單的理解在 Java 的正則表達式中,兩個 \\ 表明其餘語言中的一個 \,這也就是爲何表示一位數字的正則表達式是 \\d,而表示一個普通的反斜槓是 \\\\。函數
字符學習 |
說明編碼 |
---|---|
\spa |
將下一字符標記爲特殊字符、文本、反向引用或八進制轉義符。例如,"n"匹配字符"n"。"\n"匹配換行符。序列"\\\\"匹配"\\","\\("匹配"("。 |
^ |
匹配輸入字符串開始的位置。若是設置了 RegExp 對象的 Multiline 屬性,^ 還會與"\n"或"\r"以後的位置匹配。 |
$ |
匹配輸入字符串結尾的位置。若是設置了 RegExp 對象的 Multiline 屬性,$ 還會與"\n"或"\r"以前的位置匹配。 |
* |
零次或屢次匹配前面的字符或子表達式。例如,zo* 匹配"z"和"zoo"。* 等效於 {0,}。 |
+ |
一次或屢次匹配前面的字符或子表達式。例如,"zo+"與"zo"和"zoo"匹配,但與"z"不匹配。+ 等效於 {1,}。 |
? |
零次或一次匹配前面的字符或子表達式。例如,"do(es)?"匹配"do"或"does"中的"do"。? 等效於 {0,1}。 |
{n} |
n 是非負整數。正好匹配 n 次。例如,"o{2}"與"Bob"中的"o"不匹配,但與"food"中的兩個"o"匹配。 |
{n,} |
n 是非負整數。至少匹配 n 次。例如,"o{2,}"不匹配"Bob"中的"o",而匹配"foooood"中的全部 o。"o{1,}"等效於"o+"。"o{0,}"等效於"o*"。 |
{n,m} |
m 和 n 是非負整數,其中 n <= m。匹配至少 n 次,至多 m 次。例如,"o{1,3}"匹配"fooooood"中的頭三個 o。'o{0,1}' 等效於 'o?'。注意:您不能將空格插入逗號和數字之間。 |
? |
當此字符緊隨任何其餘限定符(*、+、?、{n}、{n,}、{n,m})以後時,匹配模式是"非貪心的"。"非貪心的"模式匹配搜索到的、儘量短的字符串,而默認的"貪心的"模式匹配搜索到的、儘量長的字符串。例如,在字符串"oooo"中,"o+?"只匹配單個"o",而"o+"匹配全部"o"。 |
. |
匹配除"\r\n"以外的任何單個字符。若要匹配包括"\r\n"在內的任意字符,請使用諸如"[\s\S]"之類的模式。 |
(pattern) |
匹配 pattern 並捕獲該匹配的子表達式。可使用 $0…$9 屬性從結果"匹配"集合中檢索捕獲的匹配。若要匹配括號字符 ( ),請使用"\("或者"\)"。 |
(?:pattern) |
匹配 pattern 但不捕獲該匹配的子表達式,即它是一個非捕獲匹配,不存儲供之後使用的匹配。這對於用"or"字符 (|) 組合模式部件的狀況頗有用。例如,'industr(?:y|ies) 是比 'industry|industries' 更經濟的表達式。 |
(?=pattern) |
執行正向預測先行搜索的子表達式,該表達式匹配處於匹配 pattern 的字符串的起始點的字符串。它是一個非捕獲匹配,即不能捕獲供之後使用的匹配。例如,'Windows (?=95|98|NT|2000)' 匹配"Windows 2000"中的"Windows",但不匹配"Windows 3.1"中的"Windows"。預測先行不佔用字符,即發生匹配後,下一匹配的搜索緊隨上一匹配以後,而不是在組成預測先行的字符後。 |
(?!pattern) |
執行反向預測先行搜索的子表達式,該表達式匹配不處於匹配 pattern 的字符串的起始點的搜索字符串。它是一個非捕獲匹配,即不能捕獲供之後使用的匹配。例如,'Windows (?!95|98|NT|2000)' 匹配"Windows 3.1"中的 "Windows",但不匹配"Windows 2000"中的"Windows"。預測先行不佔用字符,即發生匹配後,下一匹配的搜索緊隨上一匹配以後,而不是在組成預測先行的字符後。 |
x|y |
匹配 x 或 y。例如,'z|food' 匹配"z"或"food"。'(z|f)ood' 匹配"zood"或"food"。 |
[xyz] |
字符集。匹配包含的任一字符。例如,"[abc]"匹配"plain"中的"a"。 |
[^xyz] |
反向字符集。匹配未包含的任何字符。例如,"[^abc]"匹配"plain"中"p","l","i","n"。 |
[a-z] |
字符範圍。匹配指定範圍內的任何字符。例如,"[a-z]"匹配"a"到"z"範圍內的任何小寫字母。 |
[^a-z] |
反向範圍字符。匹配不在指定的範圍內的任何字符。例如,"[^a-z]"匹配任何不在"a"到"z"範圍內的任何字符。 |
\b |
匹配一個字邊界,即字與空格間的位置。例如,"er\b"匹配"never"中的"er",但不匹配"verb"中的"er"。 |
\B |
非字邊界匹配。"er\B"匹配"verb"中的"er",但不匹配"never"中的"er"。 |
\cx |
匹配 x 指示的控制字符。例如,\cM 匹配 Control-M 或回車符。x 的值必須在 A-Z 或 a-z 之間。若是不是這樣,則假定 c 就是"c"字符自己。 |
\d |
數字字符匹配。等效於 [0-9]。 |
\D |
非數字字符匹配。等效於 [^0-9]。 |
\f |
換頁符匹配。等效於 \x0c 和 \cL。 |
\n |
換行符匹配。等效於 \x0a 和 \cJ。 |
\r |
匹配一個回車符。等效於 \x0d 和 \cM。 |
\s |
匹配任何空白字符,包括空格、製表符、換頁符等。與 [ \f\n\r\t\v] 等效。 |
\S |
匹配任何非空白字符。與 [^ \f\n\r\t\v] 等效。 |
\t |
製表符匹配。與 \x09 和 \cI 等效。 |
\v |
垂直製表符匹配。與 \x0b 和 \cK 等效。 |
\w |
匹配任何字類字符,包括下劃線。與"[A-Za-z0-9_]"等效。 |
\W |
與任何非單詞字符匹配。與"[^A-Za-z0-9_]"等效。 |
\xn |
匹配 n,此處的 n 是一個十六進制轉義碼。十六進制轉義碼必須正好是兩位數長。例如,"\x41"匹配"A"。"\x041"與"\x04"&"1"等效。容許在正則表達式中使用 ASCII 代碼。 |
\num |
匹配 num,此處的 num 是一個正整數。到捕獲匹配的反向引用。例如,"(.)\1"匹配兩個連續的相同字符。 |
\n |
標識一個八進制轉義碼或反向引用。若是 \n 前面至少有 n 個捕獲子表達式,那麼 n 是反向引用。不然,若是 n 是八進制數 (0-7),那麼 n是八進制轉義碼。 |
\nm |
標識一個八進制轉義碼或反向引用。若是 \nm 前面至少有 nm 個捕獲子表達式,那麼 nm 是反向引用。若是 \nm 前面至少有 n 個捕獲,則 n 是反向引用,後面跟有字符 m。若是兩種前面的狀況都不存在,則 \nm 匹配八進制值 nm,其中 n 和 m 是八進制數字 (0-7)。 |
\nml |
當 n 是八進制數 (0-3),m 和 l 是八進制數 (0-7) 時,匹配八進制轉義碼 nml。 |
\un |
匹配 n,其中 n 是以四位十六進制數表示的 Unicode 字符。例如,\u00A9 匹配版權符號 (©)。 |
根據 Java Language Specification 的要求,Java 源代碼的字符串中的反斜線被解釋爲 Unicode 轉義或其餘字符轉義。所以必須在字符串字面值中使用兩個反斜線,表示正則表達式受到保護,不被 Java 字節碼編譯器解釋。例如,當解釋爲正則表達式時,字符串字面值 "\b" 與單個退格字符匹配,而 "\\b" 與單詞邊界匹配。字符串字面值 "\(hello\)" 是非法的,將致使編譯時錯誤;要與字符串 (hello) 匹配,必須使用字符串字面值 "\\(hello\\)"。
Java正則表達式中的用法是使用java.util.regex包下的Pattern和Matcher類。先經過Pattern類的靜態方法Pattern.compile(String regex) 編譯正則表達式,而後再利用返回的Pattern類中的matcher(CharSequence input)方法來生產Matcher對象,或者直接調用matches(String regex, CharSequence input),其內部源碼和前面先用compile和matcher是如出一轍的。而後再根據Matcher對象提供的API完成相應的操做。
因此下面咱們它們兩者的使用:此部分參考:https://www.cnblogs.com/tester-rikaizhao/articles/9802381.html
Pattern類用於建立一個正則表達式,也能夠說是建立一個匹配模式,能夠經過兩個靜態方法建立:compile(String regex)和compile(String regex,int flags),其中regex是正則表達式,flags爲可選模式(如:Pattern.CASE_INSENSITIVE 忽略大小寫)
實例:
1 Pattern pattern = Pattern.compile("Java"); 2 System.out.println(pattern.pattern());//返回此模式的正則表達式即Java
Pattern類還有兩個根據匹配模式拆分輸入序列的方法:split(CharSequence input) 和split(CharSequence input, int limit),其中limit爲返回元素的個數。
實例:
1 Pattern pattern = Pattern.compile("Java"); 2 String test="123Java456Java789Java"; 3 String[] result = pattern.split(test); 4 for(String s : result) 5 System.out.println(s);
結果:
123 456 789
再細說一下split(CharSequence input, int limit),當limit值大於所能返回的字符串的最多個數或者爲負數,返回的字符串個數將不受限制,但結尾可能包含空串,而當limit=0時與split(CharSequence input)等價,但結尾的空串會被丟棄。
1 Pattern pattern = Pattern.compile("Java"); 2 String test = "123Java456Java789Java"; 3 4 String[] result = pattern.split(test,2); 5 for(String s : result) 6 System.out.println(s); 7 8 result = pattern.split(test,10); 9 System.out.println(result.length); 10 11 result = pattern.split(test,-2); 12 System.out.println(result.length); 13 14 result = pattern.split(test,0); 15 System.out.println(result.length);
運行結果:
123 456Java789Java 4 4 3
Pattern類也自帶一個靜態匹配方法matches(String regex, CharSequence input),但只能進行全字符串匹配而且只能返回是否匹配上的boolean值
實例:
1 String test1 = "Java"; 2 String test2 = "Java123456"; 3 4 System.out.println(Pattern.matches("Java",test1));//返回true 5 System.out.println(Pattern.matches("Java",test2));//返回false
最後就要過渡到Matcher類了,Pattern類中的matcher(CharSequence input)會返回一個Matcher對象。
Matcher類提供了對正則表達式的分組支持,以及對正則表達式的屢次匹配支持,要想獲得更豐富的正則匹配操做,那就須要將Pattern與Matcher聯合使用。
實例:
1 Pattern pattern = Pattern.compile("Java"); 2 String test = "123Java456Java789Java"; 3 Matcher matcher = pattern.matcher();
Matcher類提供了三個返回boolean值得匹配方法:matches(),lookingAt(),find(),find(int start),其中matches()用於全字符串匹配,lookingAt從字符串最開頭開始匹配知足的子串,find能夠對任意位置字符串匹配,其中start爲起始查找索引值。
實例
1 Pattern pattern = Pattern.compile("Java"); 2 String test1 = "Java"; 3 String test2 = "Java1234"; 4 String test3 = "1234Java" 5 Matcher matcher = pattern.matcher(test1); 6 System.out.println(matcher.matches());//返回true 7 matcher = pattern.matcher(test2); 8 System.out.println(matcher.matches());//返回false 9 10 matcher = pattern.matcher(test2); 11 System.out.println(matcher.lookingAt())://返回true 12 matcher = pattern.matcher(test3); 13 System.out.println(matcher.lookingAt());//返回false 14 15 matcher = pattern.matcher(test1); 16 System.out.println(matcher.find());//返回true 17 matcher = pattern.matcher(test2); 18 System.out.println(matcher.find());//返回true 19 matcher = pattern.matcher(test3); 20 System.out.println(matcher.find(2));//返回true 21 matcher = pattern.matcher(test3); 22 System.out.println(matcher.find(5));//返回false
這裏介紹下組的概念:組是用括號劃分的正則表達式,能夠根據組的編號來引用這個組。組號爲0表示整個表達式,組號爲1表示被第一對括號括起的組,依次類推,例如A(B(C))D,組0是ABCD,組1是BC,組2是C。
Matcher類提供了start(),end(),group()分別用於返回字符串的起始索引,結束索引,以及匹配到到的字符串。
實例:
1 Pattern pattern = Pattern.compile("Java"); 2 String test = "123Java456"; 3 4 Matcher matcher = pattern.matcher(test); 5 matcher.find(); 6 System.out.println(matcher.start());//返回3 7 System.out.println(matcher.end());//返回7 8 System.out.println(matcher.group());//返回Java
Matcher類提供了start(int gropu),end(int group),group(int i),groupCount()用於分組操做
實例:
1 Pattern pattern = Pattern.compile("(Java)(Python)"); 2 String test = "123JavaPython456"; 3 Matcher matcher = pattern.matcher(test); 4 matcher.find(); 5 System.out.println(matcher.groupCount());//返回2 6 7 System.out.println(matcher.group(1));//返回第一組匹配到的字符串"Java",注意起始索引是1 8 System.out.println(matcher.start(1));//返回3,第一組起始索引 9 System.out.println(matcher.end(1));//返回7 第一組結束索引 10 11 System.out.println(matcher.group(2));//返回第二組匹配到的字符串"Python" 12 System.out.println(matcher.start(2));//返回7,第二組起始索引 13 System.out.println(matcher.end(2));//返回13 第二組結束索引
Matcher類還提供region(int start, int end)(不包括end)方法用於設定查找範圍,並提供regionStrat()和regionEnd()用於返回起始和結束查找的索引
1 Pattern pattern = Pattern.compile("Java"); 2 String test = "123JavaJava"; 3 Matcher matcher = pattern.matcher(test); 4 matcher.region(7, 11); 5 System.out.println(matcher.regionStart());//返回7 6 System.out.println(matcher.regionEnd());//返回11 7 matcher.find(); 8 System.out.println(matcher.group());//返回Java
Matcher類提供了兩種用於重置當前匹配器的方法:reset()和reset(CharSequence input)
1 Pattern pattern = Pattern.compile("Java"); 2 String test = "Java"; 3 Matcher matcher = pattern.matcher(test); 4 5 matcher.find(); 6 System.out.println(matcher.group());//返回Java 7 8 matcher.reset();//從起始位置從新匹配 9 10 matcher.find(); 11 System.out.println(matcher.group());//返回Java 12 13 matcher.reset("Python"); 14 System.out.println(matcher.find());//返回false
最後說一下Matcher類的匹配方法:replaceAll(String replacement) 和 replaceFirst(String replacement),其中replaceAll是替換所有匹配到的字符串,而replaceFirst僅僅是替換第一個匹配到的字符串。
1 Pattern pattern = Pattern.compile("Java"); 2 String test = "JavaJava"; 3 Matcher matcher = pattern.matcher(test); 4 System.out.println(matcher.replaceAll("Python"));//返回PythonPython 5 System.out.println(matcher.replaceFirst("python"));//返回PythonJava
還有兩個方法appendReplacement(StringBuffer sb, String replacement) 和 appendTail(StringBuffer sb)也很重要,appendReplacement容許直接將匹配的字符串保存在另外一個StringBuffer中而且是漸進式匹配,並非只匹配依次或匹配所有,而appendTail則是將未匹配到的餘下的字符串添加到StringBuffer中。
1 Pattern pattern = Pattern.compile("Java"); 2 Matcher matcher = pattern.matcher("Java1234"); 3 4 System.out.println(matcher.find());//返回true 5 StringBuffer sb = new StringBuffer(); 6 7 matcher.appendReplacement(sb, "Python"); 8 System.out.println(sb);//輸出Python 9 10 matcher.appendTail(sb); 11 System.out.println(sb);//輸出Python1234
引用連接:https://blog.csdn.net/zpz2411232428/article/details/83549502
1、校驗數字的表達式
1 數字:^[0-9]*$ 2 n位的數字:^\d{n}$ 3 至少n位的數字:^\d{n,}$ 4 m-n位的數字:^\d{m,n}$ 5 零和非零開頭的數字:^(0|[1-9][0-9]*)$ 6 非零開頭的最多帶兩位小數的數字:^([1-9][0-9]*)+(.[0-9]{1,2})?$ 7 帶1-2位小數的正數或負數:^(\-)?\d+(\.\d{1,2})?$ 8 正數、負數、和小數:^(\-|\+)?\d+(\.\d+)?$ 9 有兩位小數的正實數:^[0-9]+(.[0-9]{2})?$ 10 有1~3位小數的正實數:^[0-9]+(.[0-9]{1,3})?$ 11 非零的正整數:^[1-9]\d*$ 或 ^([1-9][0-9]*){1,3}$ 或 ^\+?[1-9][0-9]*$ 12 非零的負整數:^\-[1-9][]0-9"*$ 或 ^-[1-9]\d*$ 13 非負整數:^\d+$ 或 ^[1-9]\d*|0$ 14 非正整數:^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$ 15 非負浮點數:^\d+(\.\d+)?$ 或 ^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$ 16 非正浮點數:^((-\d+(\.\d+)?)|(0+(\.0+)?))$ 或 ^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$ 17 正浮點數:^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$ 或 ^(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*))$ 18 負浮點數:^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$ 或 ^(-(([0-9]+\.[0-9]*[1-9][0-9]*)|([0-9]*[1-9][0-9]*\.[0-9]+)|([0-9]*[1-9][0-9]*)))$ 19 浮點數:^(-?\d+)(\.\d+)?$ 或 ^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$
2、校驗字符的表達式 1 漢字:^[\u4e00-\u9fa5]{0,}$ 2 英文和數字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$ 3 長度爲3-20的全部字符:^.{3,20}$ 4 由26個英文字母組成的字符串:^[A-Za-z]+$ 5 由26個大寫英文字母組成的字符串:^[A-Z]+$ 6 由26個小寫英文字母組成的字符串:^[a-z]+$ 7 由數字和26個英文字母組成的字符串:^[A-Za-z0-9]+$ 8 由數字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$ 9 中文、英文、數字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$ 10 中文、英文、數字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$ 11 能夠輸入含有^%&',;=?$\"等字符:[^%&',;=?$\x22]+ 12 禁止輸入含有~的字符:[^~\x22]+ 3、特殊需求表達式 1 Email地址:^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$ 2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.? 3 InternetURL:[a-zA-z]+://[^\s]* 或 ^https://([\w-]+\.)+[\w-]+(/[\w-./?%&=]*)?$ 4 手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$ 5 電話號碼("XXX-XXXXXXX"、"XXXX-XXXXXXXX"、"XXX-XXXXXXX"、"XXX-XXXXXXXX"、"XXXXXXX"和"XXXXXXXX):^(\(\d{3,4}-)|\d{3.4}-)?\d{7,8}$ 6 國內電話號碼(0511-440522二、021-87888822):\d{3}-\d{8}|\d{4}-\d{7} 7 身份證號: 15或18位身份證:^\d{15}|\d{18}$ 15位身份證:^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$ 18位身份證:^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$ 8 短身份證號碼(數字、字母x結尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$ 9 賬號是否合法(字母開頭,容許5-16字節,容許字母數字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 10 密碼(以字母開頭,長度在6~18之間,只能包含字母、數字和下劃線):^[a-zA-Z]\w{5,17}$ 11 強密碼(必須包含大小寫字母和數字的組合,不能使用特殊字符,長度在8-10之間):^(?=.*\d)(?=.*[a-z])(?=.*[A-Z]).{8,10}$ 12 日期格式:^\d{4}-\d{1,2}-\d{1,2} 13 一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$ 14 一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$ 15 錢的輸入格式: 16 1.有四種錢的表示形式咱們能夠接受:"10000.00" 和 "10,000.00", 和沒有 "分" 的 "10000" 和 "10,000":^[1-9][0-9]*$ 17 2.這表示任意一個不以0開頭的數字,可是,這也意味着一個字符"0"不經過,因此咱們採用下面的形式:^(0|[1-9][0-9]*)$ 18 3.一個0或者一個不以0開頭的數字.咱們還能夠容許開頭有一個負號:^(0|-?[1-9][0-9]*)$ 19 4.這表示一個0或者一個可能爲負的開頭不爲0的數字.讓用戶以0開頭好了.把負號的也去掉,由於錢總不能是負的吧.下面咱們要加的是說明可能的小數部分:^[0-9]+(.[0-9]+)?$ 20 5.必須說明的是,小數點後面至少應該有1位數,因此"10."是不經過的,可是 "10" 和 "10.2" 是經過的:^[0-9]+(.[0-9]{2})?$ 21 6.這樣咱們規定小數點後面必須有兩位,若是你認爲太苛刻了,能夠這樣:^[0-9]+(.[0-9]{1,2})?$ 22 7.這樣就容許用戶只寫一位小數.下面咱們該考慮數字中的逗號了,咱們能夠這樣:^[0-9]{1,3}(,[0-9]{3})*(.[0-9]{1,2})?$ 23 8.1到3個數字,後面跟着任意個 逗號+3個數字,逗號成爲可選,而不是必須:^([0-9]+|[0-9]{1,3}(,[0-9]{3})*)(.[0-9]{1,2})?$ 24 備註:這就是最終結果了,別忘了"+"能夠用"*"替代若是你以爲空字符串也能夠接受的話(奇怪,爲何?)最後,別忘了在用函數時去掉去掉那個反斜槓,通常的錯誤都在這裏 25 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\\.[x|X][m|M][l|L]$ 26 中文字符的正則表達式:[\u4e00-\u9fa5] 27 雙字節字符:[^\x00-\xff] (包括漢字在內,能夠用來計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)) 28 空白行的正則表達式:\n\s*\r (能夠用來刪除空白行) 29 HTML標記的正則表達式:<(\S*?)[^>]*>.*?|<.*? /> (網上流傳的版本太糟糕,上面這個也僅僅能部分,對於複雜的嵌套標記依舊無能爲力) 30 首尾空白字符的正則表達式:^\s*|\s*$或(^\s*)|(\s*$) (能夠用來刪除行首行尾的空白字符(包括空格、製表符、換頁符等等),很是有用的表達式) 31 騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始) 32 中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼爲6位數字) 33 IP地址:\d+\.\d+\.\d+\.\d+ (提取IP地址時有用)