日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

常用正则表达式(?i)忽略字母的大小写!

發布時間:2023/12/2 编程问答 211 豆豆
生活随笔 收集整理的這篇文章主要介紹了 常用正则表达式(?i)忽略字母的大小写! 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載自:http://blog.csdn.net/iwanttoknow7/article/details/5773285

1^/d+$  //匹配非負整數(正整數?+?0)?

2 ^ [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * $   // 匹配正整數?
3 ^ (( - /d + ) | ( 0 + ))$   // 匹配非正整數(負整數?+?0)?
4 ^- [ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * $   // 匹配負整數?
5 ^-? /d + $     // 匹配整數?
6 ^ /d + (/./d + ) ? $   // 匹配非負浮點數(正浮點數?+?0)?
7 ^ (([ 0 - 9 ] + /.[ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * /.[ 0 - 9 ] + ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ))$   // 匹配正浮點數?
8 ^ (( - /d + (/./d + ) ? ) | ( 0 + (/. 0 + ) ? ))$   // 匹配非正浮點數(負浮點數?+?0)?
9 ^ ( - (([ 0 - 9 ] + /.[ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * /.[ 0 - 9 ] + ) | ([ 0 - 9 ] * [ 1 - 9 ][ 0 - 9 ] * )))$   // 匹配負浮點數?
10 ^ ( -? /d + )(/./d + ) ? $   // 匹配浮點數?
11 ^ [A - Za - z] + $   // 匹配由26個英文字母組成的字符串?
12 ^ [A - Z] + $   // 匹配由26個英文字母的大寫組成的字符串?
13 ^ [a - z] + $   // 匹配由26個英文字母的小寫組成的字符串?
14 ^ [A - Za - z0 - 9 ] + $   // 匹配由數字和26個英文字母組成的字符串?
15 ^ /w + $   // 匹配由數字、26個英文字母或者下劃線組成的字符串?
16 ^ [/w - ] + (/.[/w - ] + ) * @[/w - ] + (/.[/w - ] + ) + $     // 匹配email地址?
17 ^ [a - zA - z] + : // 匹配(/w+(-/w+)*)(/.(/w+(-/w+)*))*(/?/S*)?$   // 匹配url?
18 。匹配中文字符的正則表達式:?[/u4e00 - /u9fa5]
19 。匹配雙字節字符(包括漢字在內):[ ^ /x00 - /xff]
20 。應用:計算字符串的長度(一個雙字節字符長度計2,ASCII字符計1)
String.prototype.len
= function(){ return ? this .replace([ ^ /x00 - /xff] / g, " aa " ).length;}
21 。匹配空行的正則表達式:/n[/s | ?] * /r
22 。匹配HTML標記的正則表達式: /< (. * ) > . *< / / / 1 >|< (. * )?/ />/ ?
23 。匹配首尾空格的正則表達式:( ^ /s * ) | (/s * $)

* ?正則表達式用例
??
* ? 1 ^ /S + [a - z?A - Z]$?不能為空?不能有空格??只能是英文字母
??
* ? 2 、/S{ 6 ,}?????????不能為空?六位以上
??
* ? 3 ^ /d + $??????????不能有空格?不能非數字
??
* ? 4 、(. * )(/.jpg | /.bmp)$?只能是jpg和bmp格式
??
* ? 5 ^ /d{ 4 }/ - /d{ 1 , 2 } - /d{ 1 , 2 }$?只能是2004 - 10 - 22格式
??
* ? 6 ^ 0 $????????????至少選一項
??
* ? 7 ^ 0 { 2 ,}$????????至少選兩項
??
* ? 8 ^ [/s | /S]{ 20 ,}$?不能為空?二十字以上
??
* ? 9 ^ / +? [a - z0 - 9 ](([ -+ .] | [_] + ) ? [a - z0 - 9 ] + ) * @([a - z0 - 9 ] + (/. | / - )) + [a - z]{ 2 , 6 }$郵件
??
* ? 10 、/w + ([ -+ .]/w + ) * @/w + ([ - .]/w + ) * /./w + ([ - .]/w + ) * ([,;]/s * /w + ([ -+ .]/w + ) * @/w + ([ - .]/w + ) * /./w + ([ - .]/w + ) * ) * ?輸入多個地址用逗號或空格分隔郵件
??
* ? 11 ^ (/([ 0 - 9 ] + /)) ? [ 0 - 9 ]{ 7 , 8 }$電話號碼7位或8位或前面有區號例如( 022 87341628
??
* ? 12 ^ [a - z?A - Z? 0 - 9 ?_] + @[a - z?A - Z? 0 - 9 ?_] + (/.[a - z?A - Z? 0 - 9 ?_] + ) + (/,[a - z?A - Z? 0 - 9 ?_] + @[a - z?A - Z? 0 - 9 ?_] + (/.[a - z?A - Z? 0 - 9 ?_] + ) + ) * $
??
* ?????只能是字母、數字、下劃線;必須有@和.同時格式要規范?郵件
??
* ? 13 ? ^ /w + @/w + (/./w + ) + (/,/w + @/w + (/./w + ) + ) * $上面表達式也可以寫成這樣子,更精練。
????
14 ??? ^ /w + (( - /w + ) | (/./w + )) * /@/w + ((/. |- )/w + ) * /./w + $?

??

??

??

// ?限定條件
????????? final ?String?CONDITION? = ? " (?=.*[a-z])(?=.*[A-Z])(?=.*//d) " ;

????????
// ?允許出現的字符
????????? final ?String?SPECIAL_CHAR? = ? " [-A-Za-z0-9!$%&()/;<?{}//[//]^] " ;

????????
// ?數量
????????? final ?String?QUANTITY? = ? " {8,16} " ;?

??

1 ?樓的回復

(
?= . * [a - z])?表示當前位置后面必須出現?. * [a - z]?的字符,這個可以理解為必須出現小寫字母。
或者可以理解為某一個字符間的縫隙必須滿足的條件,這個僅僅作為條件判斷并不能匹配任何字
符,因為這屬于非捕獲組中的環視(lookarround)零寬度匹配。

舉個大家常見的例子:

表達式:Win(
?= XP)
現有字符串?WinXP?和?WinNT,在應用這個表達式時前者能與之進行匹配,為什么呢?

當匹配器指示到?(
?= XP)?時,也就是在?n?字母后面的縫隙,這個縫隙必須滿足的
條件是:后面的字符必須是?XP,如果是的話,匹配成功,否則匹配失敗。由于
(
?= XP)?是匹配縫隙的,因此并不會把?XP?給匹配輸出,而只輸出了?Win?因此,這
個表達式的語義可以看作是:找到后面為“XP”字符所有的?Win。

假如,我們把表達式寫成?Win(
?= XP)( ?= NT)?這樣的話,那么這個語義是:找出后面
為“XP”并且為“NT”字符所有的?Win?可以想象,這是個
永遠無法滿足的匹配。(
?= XP)( ?= NT)?這個表示當前的縫隙必須同時滿足的條件。

把這個表達式再改一下,改成?Win(
?= . * XP)( ?= . * NT)?這個表示?Win?的后面必須出現
XP?與?NT,位置和順序都是無關的(這主要是?.
* ?的作用)。當然了這個表達式的效
率是比較低的,得向后進行兩次斷言。

如果字符串是?WincbaXPabcNT?這個字符串,當匹配指示器走到?n?后面的縫隙時開始
進行向后斷言,首先對?.
* XP?進行斷言,很明顯能將?cbaXP?匹配成功,這時第一個斷
言完成,再對?.
* NT?斷言,可以看出?cbaXPabcNT?能與其匹配成功,這時第二個斷言完
成,因此表達式?Win(
?= . * XP)( ?= . * NT)?能對?WincbaXPabcNT?進行匹配。

同理?WincbaNTabcXP?也是同樣的效果。

如果能理解上面的這些,對于?(
?= . * [a - z])( ?= . * [A - Z])( ?= . * //d)?這個的理應該不會
很難吧,這個只不過是必須同時滿足三個條件。

這個表達式在開始部分就進行斷言,即索引為?
0 ?的地方,也就是第一個字符的前面的
縫隙,這個縫隙后面的字符必須滿足?.
* [a - z]??. * [A - Z]??. * //d??三個條件,也就是說
必后面必須出現至少一個小寫字母、至少一個大寫母、至少一個數字。


至于表達式?
2 ?的使用,也就是?[??]?內字符的轉義需要注意一下。

^ ?和? - ?在?[??]?結構的表達式中是有一定意義的。

[
^ abc]?表示除?abc?以外所有的字符,注意,這是放在最前面表示這個意思,
如果改成?[a
^ bc]?這個僅表示?a? ^ ?b?c?四個字符。如果需要匹配? ^ ?這個字符
的話,千萬不要把它放在第一個,如果一定要放在第一個的話,得使用轉義符。

- ?在?[??]?表示字符的范圍,比如?[a - z]?表示?a?與?z?之間的? 26 ?個字母,
[a
- zA - Z]?這個表示?a - z?和?A - Z?的? 52 ?個字母。使用范圍得注意了,如果寫成
[z
- a]?的話,在?Pattern.compile?編譯表達式時會對范圍進行檢查,這時會產
生異常,因此在使用?
- ?范圍時,后面的?Unicode?值必須大于等于前面的?Unicode
值。

如果要匹配“
- ”的話,盡量不要把? - ?這個放在字符之間,可以放在?[??]?的兩邊。
比如?[
- a - z]?這就能匹配? 26 ?個小寫字母和“ - ”了。當然了,我們也可以寫成
[a
- z - A - Z]?這個可以匹配? 52 ?字母和“ - ”,但是這樣很不直觀,我們寧愿寫成
[a
- zA - Z - ]?或者?[ - a - zA - Z]?這樣。?

??

??

2 :不以某某開頭?,比如不以www開頭


Java?code?
public ? class ?Test?{?
????
public ? static ? void ?main(String[]?args)?{
????????String[]?strs?
= ?{? " abc1232 " ,? " wwwadsf " ,? " awwwfas " ,? " wwadfsf " ,? "" ,? " ww " ,? " ? " ,? " www " ?};?
????????String?regex?
= ? " (?:(?!^www).)* " ;?
????????
for (String?str?:?strs)?{?

????????????System.out.printf(
" %-7s?%s%n " ,?str,?str.matches(regex));
????????}
????}
}?


(
?! X)?專業名稱為?Negative?Lookahead,表示字符間縫隙后面不允許出現的字符,
即匹配字符間的縫隙,如果縫隙后的字符不是?X?的話,那這個縫隙就匹配成功。

舉個例子,aab?和?aac,現有表達式?aa(
?! b)?這時我們能匹配到的字符串是?aac,
因為?aa?的后面的縫隙之后不允許出現字符?b,因此只有?aac?進行了匹配。

再來看個示例:?

Java?code?

public ? class ?Test?{
????
public ? static ? void ?main(String[]?args)?{
????????String?str?
= ? " AQuickBrownFoxJumpsOverTheLazyDog " ;
????????String[]?strs?
= ?str.split( " (?<!^)(?=[A-Z]) " );
????????
for (String?s?:?strs)?{
????????????System.out.println(s);
????????}?
????}
}?


根據大寫字母拆分字符串。當然了,這個使用字符串進行分析同樣也能進行拆分,
但是使用正則表達式來拆的話更為便捷直觀一些。

在進行這種拆分時,由于在拆分后的字符數不能減少,因此只能使用零寬度的
lookaround?功能進行匹配,lookaround?包括四個,即:?

Java?code?
(
?= X)?( ?! X)?( ?<= X)?( ?<! X)?


來看一下這個表達式:(
? ? <!^ )( ?= [A - Z])

前面說到過?(
?! )?表示縫隙后面不允許出現的東西,而?( ? ? <! )?表示縫隙前不允許出現的東西。
(
?= )?表示縫隙后允許出現的東西,( ? ? <= )?表示縫隙前允許出現的東西。

這個表達式在拆分時,根據零寬度匹配縫隙進行拆分的,這個縫隙必須滿足以下條件:

(
? ? <!^ )?表示縫隙不允許前不能是行開始,即縫隙不能出現在首字母的前面。
(
?= [A - Z])?表示縫隙后面允許出現?A - Z?的大寫字母。

這時這個表達式就匹配了下面帶有?
| ?的縫隙:?

Java?code?
A
| Quick | Brown | Fox | Jumps | Over | The | Lazy | DogPS:不加?( ?<!^ )?的話,會變成: | A | Quick | Brown | Fox | Jumps | Over | The | Lazy | Dog?


根據?split?的功能,正則表達式處理程序就根據上面的?
| ?將字符串給拆分開來了。


3 ,不區分大小寫
不加任何限制的匹配是匹配分大小寫的,但是正則表達式中可以進行改變,
有兩種方式:參數式和內嵌式。

來看個示例:?

Java?code?
import ?java.util.regex.Matcher;
import ?java.util.regex.Pattern;
public ? class ?Test?{
????
public ? static ? void ?main(String[]?args)?{
????????String?str?
= ? " Book " ;?
????????Pattern?pattern?
= ?Pattern.compile( " book " );
????????Matcher?matcher?
= ?pattern.matcher(str);
????????System.out.println(matcher.matches());?
????}
}?


上面的這個表達式?book?是不能匹配字符串?Book?的,這時我們只要給定編譯時的參數就可以了:

Pattern?pattern?
= ?Pattern.compile( " book " ,?Pattern.CASE_INSENSITIVE);

Pattern.CASE_INSENSITIVE?這是一個?
int ?類型的常量,值為? 2 。表示表達式忽略大小寫進行區配。

如果我們不采用?Pattern?和?Matcher?兩個類來匹配的話,只是使用?String?的?matches?方法的話,
我們就不能指定表達式的編譯參數了,這時就需要采用內嵌標志表達式了,與?Pattern.CASE_INSENSITIVE
對應的內嵌標志表達式是?(
? i),它有四種形式:
1 ,( ? i)
2 ,( ?- i)
3 ,( ? i:X)
4 ,( ?- i:X)
不帶有?
- ?的是開標志,帶有? - ?的是關標志。

把上面的代碼改成這樣:?

Java?code?
public ? class ?Test?{
????
public ? static ? void ?main(String[]?args)?{
????????String?str?
= ? " Book " ;
????????String?regex?
= ? " (?i)book " ;?
????????System.out.println(str.matches(regex));
????}
}?


我們就達到了同樣的效果,當然這樣并不是最好的,因為字符串中只有?B?是大寫的,
我們沒有必要把所有的字符都進行不區分大小寫匹配,我們可以在打開標志,用?(
? i)?的
第二種形式馬上關掉它:
????String?regex?
= ? " (?i)b(?-i)ook " ;

這樣的話,只有?b?是區分大小寫了,而?(
?- i)?后面的還是得區分大小寫匹配的。這樣寫
可能看上去很不順眼,我們還能使用第?
3 ?種形式直接指定某些字符是不區分大小寫的。
????String?regex?
= ? " (?i:b)ook " ;

這樣的表達式與上面的那個在語義上是相同的。就效率上肯定是優于一下子開,一下子關的。

可見內嵌標志表達式要比指定編譯參數的功能強大許多。

使用建議:如果能確定某些字符的大小寫時,盡量使用已確定的字符,對于不確定的可以采用
(
? i:X)?的方式指定。因此打開不區分大小寫開關時,對匹配的性能是有一定影響的。

思考一下:String?regex?
= ? " (?i)b(?-i:oo)k " ;?這個表達式的意思?


另外:第?
1 ?和第? 4 ,我沒看明白需要了解什么,請在下面的樓層中具體地說明一下。?

??

1 :多行匹配

在默認的情況下?.?是不能匹配行結束符的(行結束符有?
6 ?個,具體的可以看看?Pattern?的?API?DOC)
同樣,可以像不匹配大小寫匹配那樣使用編譯參數:Pattern.DOTALL

如果還得區分大小寫的話,還得加上上面說到的?Pattern.CASE_INSENSITIVE?這個,舉個例子:?

Java?code?
import ?java.util.regex.Matcher;
import ?java.util.regex.Pattern;
public ? class ?Test?{
????
public ? static ? void ?main(String[]?args)?{
????????String?str?
= ? " <table>?/n " ? + ? " ?<tr>?/n " ? + ? " ?<td>?/n " ? + ? " ?Hello?World!?/n " ? + ? " ?</td>?/n " ? + ? " ?</tr>?/n " ? + ? " </table> " ;
????????String?regex?
= ? " <td>(.+?)</td> " ;?
????????Pattern?pattern?
= ?Pattern.compile(regex);
????????Matcher?matcher?
= ?pattern.matcher(str);
????????
while (matcher.find())?{?
????????????System.out.println(matcher.group(
1 ).trim());?
????????}
????}
}?


上面這個是不能從?str?抽取出東西的,因為?td?的后面帶有換行符,我們只要更改一下:

Pattern?pattern?
= ?Pattern.compile(regex,?Pattern.DOTALL);

這樣就行了,如果?td?還得不區分大小寫的話,再改成:?

Java?code?
Pattern?pattern?
= ?Pattern.compile(regex,?Pattern.DOTALL? | ?Pattern.CASE_INSENSITIVE);?


這樣的話,td?哪怕是大寫的這個表達式都能把?td?之間的字符區抽取出來。

當然和?Pattern.CASE_INSENSITIVE?一樣,Pattern.DOTALL?也有內嵌標志表達式,即?(
? s)
s?的意思表示?single
- line?就是忽略換行符什么的,只看成單行進行處理。

這個表達式使用內嵌?(
? s)?的話可以改為:?

Java?code?
String?regex?
= ? " (?s)<td>(.+?)</td> " ;如果還要不區分大小寫的話,再加上?i?標志:String?regex? = ? " (?s)(?i)<td>(.+?)</td> " ;但這樣顯得很拖沓,可以把它們合并起來:String?regex? = ? " (?is)<td>(.+?)</td> " ;? // ?秩序無所謂?


最后需要說明一下的是,我曾看到過由于不明白?DOTALL,為了讓?.?匹配行結束符,直接把表達式寫成:?

Java?code?
String?regex?
= ? " <td>((.|//s)+?)</td> " ;?


這樣做是極其危險的,由于選擇結構的匹配效率問題,這樣做在比較長的字符串時會造成堆棧溢出,
使程序崩潰,如果使用?DOTALL?或者?(
? s)?的話就不會出現這種情況。


4 :2個單元的或操作

| ?稱為多選結構,用于匹配? | ?之中的任何一個,拿你的例子來說明:?

Java?code?
import ?java.util.regex.Matcher;
import ?java.util.regex.Pattern;
public ? class ?Test?{?
????
public ? static ? void ?main(String[]?args)?{?
????????String?str?
= ? " <img?src=/ " http: // www.google.com/1.gif/"/>/n"?+?"<img?src=/" http://3w.google.com/1.gif /"/>/n"?+?"<img?src=/" http://abc.baidu.com/1.gif /"/>";
????????String?regex? = ? " <img//ssrc=/ " http: // (?:ww|3)w.google.com/1.gif/"/>";
????????Pattern?pattern? = ?Pattern.compile(regex);
????????Matcher?matcher?
= ?pattern.matcher(str);?
????????
while (matcher.find())?{?
????????????System.out.println(matcher.group());?
????????}?
????}
}?


注意到其中的?(
? :ww | 3 )?在進行多選匹配時盡量找出多選中的規律,以減少多選的字符,
www?和?3w?在最后一個字符可以共用,前面的不一樣。

(
? :?)?的意思表示組成一組,如果沒有?( ? :?)?這樣的話,表達式就變成了:?

Java?code?
String?regex?
= ? " <img//ssrc=/ " http: // ww|3w.google.com/1.gif/"/>";?


這樣的語義完全變掉了,
| ?是在一組中進行選擇,由于上面的那個表達式中沒有組,就把整個表
達式作為了一組,使用?
| ?的話,就進行了整個表達式的多選結構了。這個表達式的意思是:
匹配?
< img?ssrc = " http://ww?或者是?3w.google.com/1.gif " /> ,這樣的結果并不是我們所要的。

我們僅僅需要在?ww?和?
3 ?之間進行選擇,這時只要把?ww?和? 3 ?放在一組中進行多選擇就可以了,
變成?(
? :ww | 3 )。

還有,在多選結構中盡量把出現頻率高的放在前面,這樣可以加快匹配速度。

多選結構的效率在傳統型的引擎中是效率低下的,如果是單個字符的選擇,比如?a?$?
& ?之中的一個,
那就不要使用?(
? :a | $ |& )?了,可以直接使用字符類?[a$ & ]?就可以了。

說了那么多,不知道是否明白了??

總結

以上是生活随笔為你收集整理的常用正则表达式(?i)忽略字母的大小写!的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。