国产无遮挡裸体免费直播视频,久久精品国产蜜臀av,动漫在线视频一区二区,欧亚日韩一区二区三区,久艹在线 免费视频,国产精品美女网站免费,正在播放 97超级视频在线观看,斗破苍穹年番在线观看免费,51最新乱码中文字幕

JAVA 正則表達式陳廣佳版本(超詳細)

 更新時間:2020年03月05日 16:46:21   作者:陳廣佳  
在Sun的Java JDK 1.40版本中,Java自帶了支持正則表達式的包,本文就拋磚引玉地介紹了如何使用java.util.regex包,需要的朋友可以參考下

在Sun的Java JDK 1.40版本中,Java自帶了支持正則表達式的包,本文就拋磚引玉地介紹了如何使用java.util.regex包。

  可粗略估計一下,除了偶爾用Linux的外,其他Linu x用戶都會遇到正則表達式。正則表達式是個極端強大工具,而且在字符串模式-匹配和字符串模式-替換方面富有彈性。在Unix世界里,正則表達式幾乎沒有什么限制,可肯定的是,它應(yīng)用非常之廣泛。

  正則表達式的引擎已被許多普通的Unix工具所實現(xiàn),包括grep,awk,vi和Emacs等。此外,許多使用比較廣泛的腳本語言也支持正則表達式,比如Python,Tcl,JavaScript,以及最著名的Perl。

  我很早以前就是個Perl方面的黑客,如果你和我一樣話,你也會非常依賴你手邊的這些強大的text-munging工具。近幾年來,像其他程序開發(fā)者一樣,我也越來越關(guān)注Java的開發(fā)。

  Java作為一種開發(fā)語言,有許多值得推薦的地方,但是它一直以來沒有自帶對正則表達式的支持。直到最近,借助于第三方的類庫,Java開始支持正則表達式,但這些第三方的類庫都不一致、兼容性差,而且維護代碼起來很糟糕。這個缺點,對我選擇Java作為首要的開發(fā)工具來說,一直是個巨大的顧慮之處。

  你可以想象,當(dāng)我知道Sun的Java JDK 1.40版本包含了java.util.regex(一個完全開放、自帶的正則表達式包)時,是多么的高興!很搞笑的說,我花好些時間去挖掘這個被隱藏起來的寶石。我非常驚奇的是,Java這樣的一個很大改進(自帶了java.util.regex包)為什么不多公開一點呢?!

  最近,Java雙腳都跳進了正則表達式的世界。java.util.regex包在支持正則表達也有它的過人之處,另外Java也提供詳細的相關(guān)說明文檔。使得朦朦朧朧的regex神秘景象也慢慢被撥開。有一些正則表達式的構(gòu)成(可能最顯著的是,在于糅合了字符類庫)在Perl都找不到。

  在regex包中,包括了兩個類,Pattern(模式類)和Matcher(匹配器類)。Pattern類是用來表達和陳述所要搜索模式的對象,Matcher類是真正影響搜索的對象。另加一個新的例外類,PatternSyntaxException,當(dāng)遇到不合法的搜索模式時,會拋出例外。

  即使對正則表達式很熟悉,你會發(fā)現(xiàn),通過java使用正則表達式也相當(dāng)簡單。要說明的一點是,對那些被Perl的單行匹配所寵壞的Perl狂熱愛好者來說,在使用java的regex包進行替換操作時,會比他們所以前常用的方法費事些。

  本文的局限之處,它不是一篇正則表達式用法的完全教程。如果讀者要對正則表達進一步了解的話,推薦閱讀Jeffrey Frieldl的Mastering Regular Expressions,該書由O'Reilly出版社出版。我下面就舉一些例子來教讀者如何使用正則表達式,以及如何更簡單地去使用它。

  設(shè)計一個簡單的表達式來匹配任何電話號碼數(shù)字可能是比較復(fù)雜的事情,原因在于電話號碼格式有很多種情況。所有必須選擇一個比較有效的模式。比如:(212) 555-1212, 212-555-1212和212 555 1212,某些人會認為它們都是等價的。

  首先讓我們構(gòu)成一個正則表達式。為簡單起見,先構(gòu)成一個正則表達式來識別下面格式的電話號碼數(shù)字:(nnn)nnn-nnnn。

  第一步,創(chuàng)建一個pattern對象來匹配上面的子字符串。一旦程序運行后,如果需要的話,可以讓這個對象一般化。匹配上面格式的正則表達可以這樣構(gòu)成:(/d{3})/s/d{3}-/d{4},其中/d單字符類型用來匹配從0到9的任何數(shù)字,另外{3}重復(fù)符號,是個簡便的記號,用來表示有3個連續(xù)的數(shù)字位,也等效于(/d/d/d)。/s也另外一個比較有用的單字符類型,用來匹配空格,比如Space鍵,tab鍵和換行符。

  是不是很簡單?但是,如果把這個正則表達式的模式用在java程序中,還要做兩件事。對java的解釋器來說,在反斜線字符(/)前的字符有特殊的含義。在java中,與regex有關(guān)的包,并不都能理解和識別反斜線字符(/),盡管可以試試看。但為避免這一點,即為了讓反斜線字符(/)在模式對象中被完全地傳遞,應(yīng)該用雙反斜線字符(/)。此外圓括號在正則表達中兩層含義,如果想讓它解釋為字面上意思(即圓括號),也需要在它前面用雙反斜線字符(/)。也就是像下面的一樣:

//(//d{3}//)//s//d{3}-//d{4}

  現(xiàn)在介紹怎樣在java代碼中實現(xiàn)剛才所講的正則表達式。要記住的事,在用正則表達式的包時,在你所定義的類前需要包含該包,也就是這樣的一行:

import java.util.regex.*;

  下面的一段代碼實現(xiàn)的功能是,從一個文本文件逐行讀入,并逐行搜索電話號碼數(shù)字,一旦找到所匹配的,然后輸出在控制臺。

BufferedReader in;
  Pattern pattern = Pattern.compile("http://(//d{3}//)//s//d{3}-//d{4}");
  in = new BufferedReader(new FileReader("phone"));
  String s;
  while ((s = in.readLine()) != null)
  {
  Matcher matcher = pattern.matcher(s);
  if (matcher.find())
  {
  System.out.println(matcher.group());
  }
  }
  in.close();

對那些熟悉用Python或Javascript來實現(xiàn)正則表達式的人來說,這段代碼很平常。在Python和Javascript這些語言中,或者其他的語言,這些正則表達式一旦明確地編譯過后,你想用到哪里都可以。與Perl的單步匹配相比,看起來多多做了些工作,但這并不很費事。

  find()方法,就像你所想象的,用來搜索與正則表達式相匹配的任何目標(biāo)字符串,group()方法,用來返回包含了所匹配文本的字符串。應(yīng)注意的是,上面的代碼,僅用在每行只能含有一個匹配的電話號碼數(shù)字字符串時。可以肯定的說,java的正則表達式包能用在一行含有多個匹配目標(biāo)時的搜索。本文的原意在于舉一些簡單的例子來激起讀者進一步去學(xué)習(xí)java自帶的正則表達式包,所以對此就沒有進行深入的探討。

  這相當(dāng)漂亮吧! 但是很遺憾的是,這僅是個電話號碼匹配器。很明顯,還有兩點可以改進。如果在電話號碼的開頭,即區(qū)位號和本地號碼之間可能會有空格。我們也可匹配這些情況,則通過在正則表達式中加入/s?來實現(xiàn),其中?元字符表示在模式可能有0或1個空格符。

  第二點是,在本地號碼位的前三位和后四位數(shù)字間有可能是空格符,而不是連字號,更有勝者,或根本就沒有分隔符,就是7位數(shù)字連在一起。對這幾種情況,我們可以用(-|)?來解決。這個結(jié)構(gòu)的正則表達式就是轉(zhuǎn)換器,它能匹配上面所說的幾種情況。在()能含有管道符|時,它能匹配是否含有空格符或連字符,而尾部的?元字符表示是否根本沒有分隔符的情況。

  最后,區(qū)位號也可能沒有包含在圓括號內(nèi),對此可以簡單地在圓括號后附上?元字符,但這不是一個很好的解決方法。因為它也包含了不配對的圓括號,比如"(555" 或 "555)"。相反,我們可以通過另一種轉(zhuǎn)換器來強迫讓電話號碼是否帶有有圓括號:(/(/d{3}/)|/d{3})。如果我們把上面代碼中的正則表達式用這些改進后的來替換的話,上面的代碼就成了一個非常有用的電話號碼數(shù)字匹配器:

  Pattern pattern =

  Pattern.compile("(//(//d{3}//)|//d{3})//s?//d{3}(-|)?//d{4}");

  可以確定的是,你可以自己試著進一步改進上面的代碼。

  現(xiàn)在看看第二個例子,它是從Friedl的中改編過來的。其功能是用來檢查文本文件中是否有重復(fù)的單詞,這在印刷排版中會經(jīng)常遇到,同樣也是個語法檢查器的問題。

  匹配單詞,像其他的一樣,也可以通過好幾種的正則表達式來完成。可能最直接的是/b/w+/b,其優(yōu)點在于只需用少量的regex元字符。其中/w元字符用來匹配從字母a到u的任何字符。+元字符表示匹配匹配一次或多次字符,/b元字符是用來說明匹配單詞的邊界,它可以是空格或任何一種不同的標(biāo)點符號(包括逗號,句號等)。

  現(xiàn)在,我們怎樣來檢查一個給定的單詞是否被重復(fù)了三次?為完成這個任務(wù),需充分利用正則表達式中的所熟知的向后掃描。如前面提到的,圓括號在正則表達式中有幾種不同的用法,一個就是能提供組合類型,組合類型用來保存所匹配的結(jié)果或部分匹配的結(jié)果(以便后面能用到),即使遇到有相同的模式。在同樣的正則表達中,可能(也通常期望)不止有一個組合類型。在第n個組合類型中匹配結(jié)果可以通過向后掃描來獲取到。向后掃描使得搜索重復(fù)的單詞非常簡單:/b(/w+)/s+/1/b。

  圓括號形成了一個組合類型,在這個正則表示中它是第一組合類型(也是僅有的一個)。向后掃描/1,指的是任何被/w+所匹配的單詞。我們的正則表達式因此能匹配這樣的單詞,它有一個或多個空格符,后面還跟有一個與此相同的單詞。注意的是,尾部的定位類型(/b)必不可少,它可以防止發(fā)生錯誤。如果我們想匹配"Paris in the the spring",而不是匹配"Java's regex package is the theme of this article"。根據(jù)java現(xiàn)在的格式,則上面的正則表達式就是:Pattern pattern =Pattern.compile("http://b(//w+)//s+//1//b");

  最后進一步的修改是讓我們的匹配器對大小寫敏感。比如,下面的情況:"The the theme of this article is the Java's regex package.",這一點在regex中能非常簡單地實現(xiàn),即通過使用在Pattern類中預(yù)定義的靜態(tài)標(biāo)志CASE_INSENSITIVE :

  Pattern pattern =Pattern.compile("http://b(//w+)//s+//1//b",

  Pattern.CASE_INSENSITIVE);

  有關(guān)正則表達式的話題是非常豐富,而且復(fù)雜的,用Java來實現(xiàn)也非常廣泛,則需要對regex包進行的徹底研究,我們在這里所講的只是冰山一角。即使你對正則表達式比較陌生,使用regex包后會很快發(fā)現(xiàn)它強大功能和可伸縮性。如果你是個來自Perl或其他語言王國的老練的正則表達式的黑客,使用過regex包后,你將會安心地投入到j(luò)ava的世界,而放棄其他的工具,并把java的regex包看成是手邊必備的利器。

CharSequence

JDK 1.4定義了一個新的接口,叫CharSequence。它提供了String和StringBuffer這兩個類的字符序列的抽象:

 CharSequence {
 charAt( i);
 length();
 subSequence( start, end);
 toString();
}

為了實現(xiàn)這個新的CharSequence接口,String,StringBuffer以及CharBuffer都作了修改。很多正則表達式的操作都要拿CharSequence作參數(shù)。

Pattern和Matcher

先給一個例子。下面這段程序可以測試正則表達式是否匹配字符串。第一個參數(shù)是要匹配的字符串,后面是正則表達式。正則表達式可以有多個。在Unix/Linux環(huán)境下,命令行下的正則表達式還必須用引號。

 java.util.regex.*;
 TestRegularExpression {
 main(String[] args) {
(args.length < 2) {
 System.out.println( +
 +
);
 System.exit(0);
 }
 System.out.println(/);
( i = 1; i < args.length; i++) {
 System.out.println(
/);
 Pattern p = Pattern.compile(args[i]);
 Matcher m = p.matcher(args[0]);
(m.find()) {
 System.out.println(" + m.group() +
 at positions " +
  m.start() + + (m.end() - 1));
 }
 }
 }
}

Java的正則表達式是由java.util.regex的Pattern和Matcher類實現(xiàn)的。Pattern對象表示經(jīng)編譯的正則表達式。靜態(tài)的compile( )方法負責(zé)將表示正則表達式的字符串編譯成Pattern對象。正如上述例程所示的,只要給Pattern的matcher( )方法送一個字符串就能獲取一個Matcher對象。此外,Pattern還有一個能快速判斷能否在input里面找到regex的

matches(?regex, ?input)

以及能返回String數(shù)組的split( )方法,它能用regex把字符串分割開來。

只要給Pattern.matcher( )方法傳一個字符串就能獲得Matcher對象了。接下來就能用Matcher的方法來查詢匹配的結(jié)果了。

matches()
lookingAt()
find()
find( start)

matches( )的前提是Pattern匹配整個字符串,而lookingAt( )的意思是Pattern匹配字符串的開頭。

find( )

Matcher.find( )的功能是發(fā)現(xiàn)CharSequence里的,與pattern相匹配的多個字符序列。例如:

 java.util.regex.*;
 com.bruceeckel.simpletest.*;
 java.util.*;
 FindDemo {
 Test monitor = Test();
 main(String[] args) {
 Matcher m = Pattern.compile()
 .matcher();
(m.find())
 System.out.println(m.group());
 i = 0;
(m.find(i)) {
 System.out.print(m.group() + );
 i++;
 }
 monitor.expect( String[] {
,
,
,
,
,
,
,
,
 +
 +

 });
 }
} 

"http://w+"的意思是"一個或多個單詞字符",因此它會將字符串直接分解成單詞。find( )像一個迭代器,從頭到尾掃描一遍字符串。第二個find( )是帶int參數(shù)的,正如你所看到的,它會告訴方法從哪里開始找——即從參數(shù)位置開始查找。

Groups

Group是指里用括號括起來的,能被后面的表達式調(diào)用的正則表達式。Group 0 表示整個表達式,group 1表示第一個被括起來的group,以此類推。所以;

A(B(C))D

里面有三個group:group 0是ABCD, group 1是BC,group 2是C。

你可以用下述Matcher方法來使用group:

public int groupCount( )返回matcher對象中的group的數(shù)目。不包括group0。

public String group( ) 返回上次匹配操作(比方說find( ))的group 0(整個匹配)

public String group(int i)返回上次匹配操作的某個group。如果匹配成功,但是沒能找到group,則返回null。

public int start(int group)返回上次匹配所找到的,group的開始位置。

public int end(int group)返回上次匹配所找到的,group的結(jié)束位置,最后一個字符的下標(biāo)加一。

java.util.regex.*;
 com.bruceeckel.simpletest.*;
 Groups {
 Test monitor = Test();
 String poem =
 +
 +
 +
 +
 +
 +
 +
;
 main(String[] args) {
 Matcher m =
 Pattern.compile()
 .matcher(poem);
(m.find()) {
( j = 0; j <= m.groupCount(); j++)
 System.out.print( + m.group(j) + );
 System.out.println();
 }
 monitor.expect( String[]{
 +
,
,
 +
,
 +
,
 +
,
 +
,
,
 +

 });
 }
}

這首詩是Through the Looking Glass的,Lewis Carroll的"Jabberwocky"的第一部分。可以看到這個正則表達式里有很多用括號括起來的group,它是由任意多個連續(xù)的非空字符('/S+')和任意多個連續(xù)的空格字符('/s+')所組成的,其最終目的是要捕獲每行的最后三個單詞;'$'表示一行的結(jié)尾。但是'$'通常表示整個字符串的結(jié)尾,所以這里要明確地告訴正則表達式注意換行符。這一點是由'(?m)'標(biāo)志完成的(模式標(biāo)志會過一會講解)。

start( )和end( )

如果匹配成功,start( )會返回此次匹配的開始位置,end( )會返回此次匹配的結(jié)束位置,即最后一個字符的下標(biāo)加一。如果之前的匹配不成功(或者沒匹配),那么無論是調(diào)用start( )還是end( ),都會引發(fā)一個IllegalStateException。下面這段程序還演示了matches( )和lookingAt( ):

java.util.regex.*;
 com.bruceeckel.simpletest.*;
 StartEnd {
 Test monitor = Test();
 main(String[] args) {
 String[] input = String[] {
,
,

 };
 Pattern
 p1 = Pattern.compile(),
 p2 = Pattern.compile();
( i = 0; i < input.length; i++) {
 System.out.println( + i + + input[i]);
 Matcher
 m1 = p1.matcher(input[i]),
 m2 = p2.matcher(input[i]);
(m1.find())
 System.out.println( + m1.group() +
+ m1.start() + + m1.end());
(m2.find())
 System.out.println( + m2.group() +
+ m2.start() + + m2.end());
(m1.lookingAt()) 
 System.out.println(
  + m1.start() + + m1.end());
(m2.lookingAt())
 System.out.println(
  + m2.start() + + m2.end());
(m1.matches()) 
 System.out.println(
  + m1.start() + + m1.end());
(m2.matches())
 System.out.println(
  + m2.start() + + m2.end());
 }
 monitor.expect( String[] {
,
,
,
 +
,
,
,
 +
,
,
,
,
,
,
,
,
,
 +
,
,

 });
 }
}

注意,只要字符串里有這個模式,find( )就能把它給找出來,但是lookingAt( )和matches( ),只有在字符串與正則表達式一開始就相匹配的情況下才能返回true。matches( )成功的前提是正則表達式與字符串完全匹配,而lookingAt( )成功的前提是,字符串的開始部分與正則表達式相匹配。

匹配的模式(Pattern flags)

compile( )方法還有一個版本,它需要一個控制正則表達式的匹配行為的參數(shù):

Pattern Pattern.compile(String regex, flag)

flag的取值范圍如下:

編譯標(biāo)志 效果
Pattern.CANON_EQ 當(dāng)且僅當(dāng)兩個字符的"正規(guī)分解(canonical decomposition)"都完全相同的情況下,才認定匹配。比如用了這個標(biāo)志之后,表達式"a/u030A"會匹配"?"。默認情況下,不考慮"規(guī)范相等性(canonical equivalence)"。
Pattern.CASE_INSENSITIVE
(?i)
默認情況下,大小寫不明感的匹配只適用于US-ASCII字符集。這個標(biāo)志能讓表達式忽略大小寫進行匹配。要想對Unicode字符進行大小不明感的匹配,只要將UNICODE_CASE與這個標(biāo)志合起來就行了。
Pattern.COMMENTS
(?x)
在這種模式下,匹配時會忽略(正則表達式里的)空格字符(注:不是指表達式里的"http://s",而是指表達式里的空格,tab,回車之類)。注釋從#開始,一直到這行結(jié)束??梢酝ㄟ^嵌入式的標(biāo)志來啟用Unix行模式。
Pattern.DOTALL
(?s)
在這種模式下,表達式'.'可以匹配任意字符,包括表示一行的結(jié)束符。默認情況下,表達式'.'不匹配行的結(jié)束符。
Pattern.MULTILINE
(?m)
在這種模式下,'^'和'$'分別匹配一行的開始和結(jié)束。此外,'^'仍然匹配字符串的開始,'$'也匹配字符串的結(jié)束。默認情況下,這兩個表達式僅僅匹配字符串的開始和結(jié)束。
Pattern.UNICODE_CASE
(?u)
在這個模式下,如果你還啟用了CASE_INSENSITIVE標(biāo)志,那么它會對Unicode字符進行大小寫不明感的匹配。默認情況下,大小寫不明感的匹配只適用于US-ASCII字符集。
Pattern.UNIX_LINES
(?d)
在這個模式下,只有'/n'才被認作一行的中止,并且與'.','^',以及'$'進行匹配。

在這些標(biāo)志里面,Pattern.CASE_INSENSITIVE,Pattern.MULTILINE,以及Pattern.COMMENTS是最有用的(其中Pattern.COMMENTS還能幫我們把思路理清楚,并且/或者做文檔)。注意,你可以用在表達式里插記號的方式來啟用絕大多數(shù)的模式。這些記號就在上面那張表的各個標(biāo)志的下面。你希望模式從哪里開始啟動,就在哪里插記號。

可以用"OR" ('|')運算符把這些標(biāo)志合使用:

java.util.regex.*;
 com.bruceeckel.simpletest.*;
 ReFlags {
 Test monitor = Test();
 main(String[] args) {
 Pattern p = Pattern.compile(,
 Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);
 Matcher m = p.matcher(
 +
 +
);
(m.find())
 System.out.println(m.group());
 monitor.expect( String[] {
,
,

 });
 }
}

這樣創(chuàng)建出來的正則表達式就能匹配以"java","Java","JAVA"...開頭的字符串了。此外,如果字符串分好幾行,那它還會對每一行做匹配(匹配始于字符序列的開始,終于字符序列當(dāng)中的行結(jié)束符)。注意,group( )方法僅返回匹配的部分。

split( )

所謂分割是指將以正則表達式為界,將字符串分割成String數(shù)組。

String[] split(CharSequence charseq)
String[] split(CharSequence charseq, limit)

這是一種既快又方便地將文本根據(jù)一些常見的邊界標(biāo)志分割開來的方法。

java.util.regex.*;
 com.bruceeckel.simpletest.*;
 java.util.*;
 SplitDemo {
 Test monitor = Test();
 main(String[] args) {
 String input =
;
 System.out.println(Arrays.asList(
 Pattern.compile().split(input)));

 System.out.println(Arrays.asList(
 Pattern.compile().split(input, 3)));
 System.out.println(Arrays.asList(
.split()));
 monitor.expect( String[] {
,
,

 });
 }
} 

第二個split( )會限定分割的次數(shù)。

正則表達式是如此重要,以至于有些功能被加進了String類,其中包括split( )(已經(jīng)看到了),matches( ),replaceFirst( )以及replaceAll( )。這些方法的功能同Pattern和Matcher的相同。

替換操作

正則表達式在替換文本方面特別在行。下面就是一些方法:

replaceFirst(String replacement)將字符串里,第一個與模式相匹配的子串替換成replacement。

replaceAll(String replacement),將輸入字符串里所有與模式相匹配的子串全部替換成replacement。

appendReplacement(StringBuffer sbuf, String replacement)對sbuf進行逐次替換,而不是像replaceFirst( )或replaceAll( )那樣,只替換第一個或全部子串。這是個非常重要的方法,因為它可以調(diào)用方法來生成replacement(replaceFirst( )和replaceAll( )只允許用固定的字符串來充當(dāng)replacement)。有了這個方法,你就可以編程區(qū)分group,從而實現(xiàn)更強大的替換功能。

調(diào)用完appendReplacement( )之后,為了把剩余的字符串拷貝回去,必須調(diào)用appendTail(StringBuffer sbuf, String replacement)。

下面我們來演示一下怎樣使用這些替換方法。說明一下,這段程序所處理的字符串是它自己開頭部分的注釋,是用正則表達式提取出來并加以處理之后再傳給替換方法的。

java.util.regex.*;
 java.io.*;
 com.bruceeckel.util.*;
 com.bruceeckel.simpletest.*;

 TheReplacements {
 Test monitor = Test();
 main(String[] args) Exception {
 String s = TextFile.read();

 Matcher mInput =
 Pattern.compile(, Pattern.DOTALL)
 .matcher(s);
(mInput.find())
 s = mInput.group(1); 

 s = s.replaceAll(, );


 s = s.replaceAll(, );
 System.out.println(s);
 s = s.replaceFirst(, );
 StringBuffer sbuf = StringBuffer();
 Pattern p = Pattern.compile();
 Matcher m = p.matcher(s);


(m.find())
 m.appendReplacement(sbuf, m.group().toUpperCase());

 m.appendTail(sbuf);
 System.out.println(sbuf);
 monitor.expect( String[]{
,
,
,
,
,
,
,
,
,

 });
 }
} 

用TextFile.read( )方法來打開和讀取文件。mInput的功能是匹配'/*!' 和 '!*/' 之間的文本(注意一下分組用的括號)。接下來,我們將所有兩個以上的連續(xù)空格全都替換成一個,并且將各行開頭的空格全都去掉(為了讓這個正則表達式能對所有的行,而不僅僅是第一行起作用,必須啟用多行模式)。這兩個操作都用了String的replaceAll( )(這里用它更方便)。注意,由于每個替換只做一次,因此除了預(yù)編譯Pattern之外,程序沒有額外的開銷。

replaceFirst( )只替換第一個子串。此外,replaceFirst( )和replaceAll( )只能用常量(literal)來替換,所以如果每次替換的時候還要進行一些操作的話,它們是無能為力的。碰到這種情況,得用appendReplacement( ),它能在進行替換的時候想寫多少代碼就寫多少。在上面那段程序里,創(chuàng)建sbuf的過程就是選group做處理,也就是用正則表達式把元音字母找出來,然后換成大寫的過程。通常你得在完成全部的替換之后才調(diào)用appendTail( ),但是如果要模仿replaceFirst( )(或"replace n")的效果,你也可以只替換一次就調(diào)用appendTail( )。它會把剩下的東西全都放進sbuf。

你還可以在appendReplacement( )的replacement參數(shù)里用"$g"引用已捕獲的group,其中'g' 表示group的號碼。不過這是為一些比較簡單的操作準(zhǔn)備的,因而其效果無法與上述程序相比。

reset( )

此外,還可以用reset( )方法給現(xiàn)有的Matcher對象配上個新的CharSequence。

java.util.regex.*;
 java.io.*;
 com.bruceeckel.simpletest.*;
 Resetting {
 Test monitor = Test();
 main(String[] args) Exception {
 Matcher m = Pattern.compile()
 .matcher();
(m.find())
 System.out.println(m.group());
 m.reset();
(m.find())
 System.out.println(m.group());
 monitor.expect( String[]{
,
,
,
,
,

 });
 }
} 

如果不給參數(shù),reset( )會把Matcher設(shè)到當(dāng)前字符串的開始處。

如果你曾經(jīng)用過Perl或任何其他內(nèi)建正則表達式支持的語言,你一定知道用正則表達式處理文本和匹配模式是多么簡單。如果你不熟悉這個術(shù)語,那么“正則表達式”(Regular Expression)就是一個字符構(gòu)成的串,它定義了一個用來搜索匹配字符串的模式。

許多語言,包括Perl、PHP、Python、JavaScript和JScript,都支持用正則表達式處理文本,一些文本編輯器用正則表達式實現(xiàn)高級“搜索-替換”功能。那么Java又怎樣呢?本文寫作時,一個包含了用正則表達式進行文本處理的Java規(guī)范需求(Specification Request)已經(jīng)得到認可,你可以期待在JDK的下一版本中看到它。

然而,如果現(xiàn)在就需要使用正則表達式,又該怎么辦呢?你可以從Apache.org下載源代碼開放的Jakarta-ORO庫。本文接下來的內(nèi)容先簡要地介紹正則表達式的入門知識,然后以Jakarta-ORO API為例介紹如何使用正則表達式。

一、正則表達式基礎(chǔ)知識

我們先從簡單的開始。假設(shè)你要搜索一個包含字符“cat”的字符串,搜索用的正則表達式就是“cat”。如果搜索對大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是說:

 

1.1 句點符號
假設(shè)你在玩英文拼字游戲,想要找出三個字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結(jié)束。另外,假設(shè)有一本英文字典,你可以用正則表達式搜索它的全部內(nèi)容。要構(gòu)造出這個正則表達式,你可以使用一個通配符——句點符號“.”。這樣,完整的表達式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”,還有其他許多無意義的組合。這是因為句點符號匹配所有字符,包括空格、Tab字符甚至換行符:

 

1.2 方括號符號

為了解決句點符號匹配范圍過于廣泛這一問題,你可以在方括號(“[]”)里面指定看來有意義的字符。此時,只有方括號里面指定的字符才參與匹配。也就是說,正則表達式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因為在方括號之內(nèi)你只能匹配單個字符:

 

1.3 “或”符號
如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那么,你可以使用“|”操作符?!皘”操作符的基本意義就是“或”運算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正則表達式。這里不能使用方擴號,因為方括號只允許匹配單個字符;這里必須使用圓括號“()”。圓括號還可以用來分組,具體請參見后面介紹。

 

1.4 表示匹配次數(shù)的符號
表一顯示了表示匹配次數(shù)的符號,這些符號用來確定緊靠該符號左邊的符號出現(xiàn)的次數(shù): 

假設(shè)我們要在文本文件中搜索美國的社會安全號碼。這個號碼的格式是999-99-9999。用來匹配它的正則表達式如圖一所示。在正則表達式中,連字符(“-”)有著特殊的意義,它表示一個范圍,比如從0到9。因此,匹配社會安全號碼中的連字符號時,它的前面要加上一個轉(zhuǎn)義字符“/”。

圖一:匹配所有123-12-1234形式的社會安全號碼

假設(shè)進行搜索的時候,你希望連字符號可以出現(xiàn),也可以不出現(xiàn)——即,999-99-9999和999999999都屬于正確的格式。這時,你可以在連字符號后面加上“?”數(shù)量限定符號,如圖二所示:

 

圖二:匹配所有123-12-1234和123121234形式的社會安全號碼

下面我們再來看另外一個例子。美國汽車牌照的一種格式是四個數(shù)字加上二個字母。它的正則表達式前面是數(shù)字部分“[0-9]{4}”,再加上字母部分“[A-Z]{2}”。圖三顯示了完整的正則表達式。

圖三:匹配典型的美國汽車牌照號碼,如8836KV

1.5 “否”符號
“^”符號稱為“否”符號。如果用在方括號內(nèi),“^”表示不想要匹配的字符。例如,圖四的正則表達式匹配所有單詞,但以“X”字母開頭的單詞除外。

圖四:匹配所有單詞,但“X”開頭的除外

1.6 圓括號和空白符號
假設(shè)要從格式為“June 26, 1951”的生日日期中提取出月份部分,用來匹配該日期的正則表達式可以如圖五所示:

圖五:匹配所有Moth DD,YYYY格式的日期

新出現(xiàn)的“/s”符號是空白符號,匹配所有的空白字符,包括Tab字符。如果字符串正確匹配,接下來如何提取出月份部分呢?只需在月份周圍加上一個圓括號創(chuàng)建一個組,然后用ORO API(本文后面詳細討論)提取出它的值。修改后的正則表達式如圖六所示:

圖六:匹配所有Month DD,YYYY格式的日期,定義月份值為第一個組

1.7 其它符號

為簡便起見,你可以使用一些為常見正則表達式創(chuàng)建的快捷符號。如表二所示:
表二:常用符號

例如,在前面社會安全號碼的例子中,所有出現(xiàn)“[0-9]”的地方我們都可以使用“/d”。修改后的正則表達式如圖七所示:

圖七:匹配所有123-12-1234格式的社會安全號碼

二、Jakarta-ORO庫

有許多源代碼開放的正則表達式庫可供Java程序員使用,而且它們中的許多支持Perl 5兼容的正則表達式語法。我在這里選用的是Jakarta-ORO正則表達式庫,它是最全面的正則表達式API之一,而且它與Perl 5正則表達式完全兼容。另外,它也是優(yōu)化得最好的API之一。

Jakarta-ORO庫以前叫做OROMatcher,Daniel Savarese大方地把它贈送給了Jakarta Project。你可以按照本文最后參考資源的說明下載它。

我首先將簡要介紹使用Jakarta-ORO庫時你必須創(chuàng)建和訪問的對象,然后介紹如何使用Jakarta-ORO API。

▲ PatternCompiler對象

首先,創(chuàng)建一個Perl5Compiler類的實例,并把它賦值給PatternCompiler接口對象。Perl5Compiler是PatternCompiler接口的一個實現(xiàn),允許你把正則表達式編譯成用來匹配的Pattern對象。

 

▲ Pattern對象

要把正則表達式編譯成Pattern對象,調(diào)用compiler對象的compile()方法,并在調(diào)用參數(shù)中指定正則表達式。例如,你可以按照下面這種方式編譯正則表達式“t[aeio]n”:

 

默認情況下,編譯器創(chuàng)建一個大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配“tin”、“tan”、 “ten”和“ton”,但不匹配“Tin”和“taN”。要創(chuàng)建一個大小寫不敏感的模式,你應(yīng)該在調(diào)用編譯器的時候指定一個額外的參數(shù):

 

創(chuàng)建好Pattern對象之后,你就可以通過PatternMatcher類用該Pattern對象進行模式匹配。

▲ PatternMatcher對象

PatternMatcher對象根據(jù)Pattern對象和字符串進行匹配檢查。你要實例化一個Perl5Matcher類并把結(jié)果賦值給PatternMatcher接口。Perl5Matcher類是PatternMatcher接口的一個實現(xiàn),它根據(jù)Perl 5正則表達式語法進行模式匹配:

 

使用PatternMatcher對象,你可以用多個方法進行匹配操作,這些方法的第一個參數(shù)都是需要根據(jù)正則表達式進行匹配的字符串:

· boolean matches(String input, Pattern pattern):當(dāng)輸入字符串和正則表達式要精確匹配時使用。換句話說,正則表達式必須完整地描述輸入字符串。
· boolean matchesPrefix(String input, Pattern pattern):當(dāng)正則表達式匹配輸入字符串起始部分時使用。
· boolean contains(String input, Pattern pattern):當(dāng)正則表達式要匹配輸入字符串的一部分時使用(即,它必須是一個子串)。
另外,在上面三個方法調(diào)用中,你還可以用PatternMatcherInput對象作為參數(shù)替代String對象;這時,你可以從字符串中最后一次匹配的位置開始繼續(xù)進行匹配。當(dāng)字符串可能有多個子串匹配給定的正則表達式時,用PatternMatcherInput對象作為參數(shù)就很有用了。用PatternMatcherInput對象作為參數(shù)替代String時,上述三個方法的語法如下:

· boolean matches(PatternMatcherInput input, Pattern pattern)
· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
· boolean contains(PatternMatcherInput input, Pattern pattern)

三、應(yīng)用實例

下面我們來看看Jakarta-ORO庫的一些應(yīng)用實例。

3.1 日志文件處理

任務(wù):分析一個Web服務(wù)器日志文件,確定每一個用戶花在網(wǎng)站上的時間。在典型的BEA WebLogic日志文件中,日志記錄的格式如下:

分析這個日志記錄,可以發(fā)現(xiàn),要從這個日志文件提取的內(nèi)容有兩項:IP地址和頁面訪問時間。你可以用分組符號(圓括號)從日志記錄提取出IP地址和時間標(biāo)記。

首先我們來看看IP地址。IP地址有4個字節(jié)構(gòu)成,每一個字節(jié)的值在0到255之間,各個字節(jié)通過一個句點分隔。因此,IP地址中的每一個字節(jié)有至少一個、最多三個數(shù)字。圖八顯示了為IP地址編寫的正則表達式:

圖八:匹配IP地址

IP地址中的句點字符必須進行轉(zhuǎn)義處理(前面加上“/”),因為IP地址中的句點具有它本來的含義,而不是采用正則表達式語法中的特殊含義。句點在正則表達式中的特殊含義本文前面已經(jīng)介紹。
日志記錄的時間部分由一對方括號包圍。你可以按照如下思路提取出方括號里面的所有內(nèi)容:首先搜索起始方括號字符(“[”),提取出所有不超過結(jié)束方括號字符(“]”)的內(nèi)容,向前尋找直至找到結(jié)束方括號字符。圖九顯示了這部分的正則表達式。

圖九:匹配至少一個字符,直至找到“]”

現(xiàn)在,把上述兩個正則表達式加上分組符號(圓括號)后合并成單個表達式,這樣就可以從日志記錄提取出IP地址和時間。注意,為了匹配“- -”(但不提取它),正則表達式中間加入了“/s-/s-/s”。完整的正則表達式如圖十所示。

圖十:匹配IP地址和時間標(biāo)記

現(xiàn)在正則表達式已經(jīng)編寫完畢,接下來可以編寫使用正則表達式庫的Java代碼了。
為使用Jakarta-ORO庫,首先創(chuàng)建正則表達式字符串和待分析的日志記錄字符串:

 

這里使用的正則表達式與圖十的正則表達式差不多完全相同,但有一點例外:在Java中,你必須對每一個向前的斜杠(“/”)進行轉(zhuǎn)義處理。圖十不是Java的表示形式,所以我們要在每個“/”前面加上一個“/”以免出現(xiàn)編譯錯誤。遺憾的是,轉(zhuǎn)義處理過程很容易出現(xiàn)錯誤,所以應(yīng)該小心謹慎。你可以首先輸入未經(jīng)轉(zhuǎn)義處理的正則表達式,然后從左到右依次把每一個“/”替換成“//”。如果要復(fù)檢,你可以試著把它輸出到屏幕上。

初始化字符串之后,實例化PatternCompiler對象,用PatternCompiler編譯正則表達式創(chuàng)建一個Pattern對象:

 

現(xiàn)在,創(chuàng)建PatternMatcher對象,調(diào)用PatternMatcher接口的contain()方法檢查匹配情況:

 

接下來,利用PatternMatcher接口返回的MatchResult對象,輸出匹配的組。由于logEntry字符串包含匹配的內(nèi)容,你可以看到類如下面的輸出:

3.2 HTML處理實例一

下面一個任務(wù)是分析HTML頁面內(nèi)FONT標(biāo)記的所有屬性。HTML頁面內(nèi)典型的FONT標(biāo)記如下所示:

 

程序?qū)凑杖缦滦问?,輸出每一個FONT標(biāo)記的屬性:

 

在這種情況下,我建議你使用兩個正則表達式。第一個如圖十一所示,它從字體標(biāo)記提取出“"face="Arial, Serif" size="+2" color="red"”。

圖十一:匹配FONT標(biāo)記的所有屬性

第二個正則表達式如圖十二所示,它把各個屬性分割成名字-值對。

圖十二:匹配單個屬性,并把它分割成名字-值對

分割結(jié)果為:

 

現(xiàn)在我們來看看完成這個任務(wù)的Java代碼。首先創(chuàng)建兩個正則表達式字符串,用Perl5Compiler把它們編譯成Pattern對象。編譯正則表達式的時候,指定Perl5Compiler.CASE_INSENSITIVE_MASK選項,使得匹配操作不區(qū)分大小寫。
接下來,創(chuàng)建一個執(zhí)行匹配操作的Perl5Matcher對象。

 

假設(shè)有一個String類型的變量html,它代表了HTML文件中的一行內(nèi)容。如果html字符串包含F(xiàn)ONT標(biāo)記,匹配器將返回true。此時,你可以用匹配器對象返回的MatchResult對象獲得第一個組,它包含了FONT的所有屬性:

 

接下來創(chuàng)建一個PatternMatcherInput對象。這個對象允許你從最后一次匹配的位置開始繼續(xù)進行匹配操作,因此,它很適合于提取FONT標(biāo)記內(nèi)屬性的名字-值對。創(chuàng)建PatternMatcherInput對象,以參數(shù)形式傳入待匹配的字符串。然后,用匹配器實例提取出每一個FONT的屬性。這通過指定PatternMatcherInput對象(而不是字符串對象)為參數(shù),反復(fù)地調(diào)用PatternMatcher對象的contains()方法完成。PatternMatcherInput對象之中的每一次迭代將把它內(nèi)部的指針向前移動,下一次檢測將從前一次匹配位置的后面開始。

本例的輸出結(jié)果如下:

 

3.3 HTML處理實例二

下面我們來看看另一個處理HTML的例子。這一次,我們假定Web服務(wù)器從widgets.acme.com移到了newserver.acme.com。現(xiàn)在你要修改一些頁面中的鏈接:

 

執(zhí)行這個搜索的正則表達式如圖十三所示:

 

 圖十三:匹配修改前的鏈接

如果能夠匹配這個正則表達式,你可以用下面的內(nèi)容替換圖十三的鏈接:

 

注意#字符的后面加上了$1。Perl正則表達式語法用$1、$2等表示已經(jīng)匹配且提取出來的組。圖十三的表達式把所有作為一個組匹配和提取出來的內(nèi)容附加到鏈接的后面。
現(xiàn)在,返回Java。就象前面我們所做的那樣,你必須創(chuàng)建測試字符串,創(chuàng)建把正則表達式編譯到Pattern對象所必需的對象,以及創(chuàng)建一個PatternMatcher對像

 

接下來,用com.oroinc.text.regex包Util類的substitute()靜態(tài)方法進行替換,輸出結(jié)果字符串:

 

Util.substitute()方法的語法如下:

 

這個調(diào)用的前兩個參數(shù)是以前創(chuàng)建的PatternMatcher和Pattern對象。第三個參數(shù)是一個Substiution對象,它決定了替換操作如何進行。本例使用的是Perl5Substitution對象,它能夠進行Perl5風(fēng)格的替換。第四個參數(shù)是想要進行替換操作的字符串,最后一個參數(shù)允許指定是否替換模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替換指定的次數(shù)。

【結(jié)束語】在這篇文章中,我為你介紹了正則表達式的強大功能。只要正確運用,正則表達式能夠在字符串提取和文本修改中起到很大的作用。另外,我還介紹了如何在Java程序中通過Jakarta-ORO庫利用正則表達式。至于最終采用老式的字符串處理方式(使用StringTokenizer,charAt,和substring),還是采用正則表達式,這就有待你自己決定了。

Jakarta-ORO篇

由于工作的需要,本人經(jīng)常要面對大量的文字電子資料的整理工作,因此曾對在JAVA中正則表達式的應(yīng)用有所關(guān)注,并對其有一定的了解,希望通過本文與同行進行有關(guān)方面的心得交流。

正則表達式:
正則表達式是一種可以用于模式匹配和替換的強有力的工具,一個正則表達式就是由普通的字符(例如字符 a 到 z)以及特殊字符(稱為元字符)組成的文字模式,它描述在查找文字主體時待匹配的一個或多個字符串。正則表達式作為一個模板,將某個字符模式與所搜索的字符串進行匹配。

正則表達式在字符數(shù)據(jù)處理中起著非常重要的作用,我們可以用正則表達式完成大部分的數(shù)據(jù)分析處理工作,如:判斷一個串是否是數(shù)字、是否是有效的Email地址,從海量的文字資料中提取有價值的數(shù)據(jù)等等,如果不使用正則表達式,那么實現(xiàn)的程序可能會很長,并且容易出錯。對這點本人深有體會,面對大量工具書電子檔資料的整理工作,如果不懂得應(yīng)用正則表達式來處理,那么將是很痛苦的一件事情,反之則將可以輕松地完成,獲得事半功倍的效果。

由于本文目的是要介紹如何在JAVA里運用正則表達式,因此對剛接觸正則表達式的讀者請參考有關(guān)資料,在此因篇幅有限不作介紹。

JAVA對正則表達式的支持:
在JDK1.3或之前的JDK版本中并沒有包含正則表達式庫可供JAVA程序員使用,之前我們一般都在使用第三方提供的正則表達式庫,這些第三方庫中有源代碼開放的,也有需付費購買的,而現(xiàn)時在JDK1.4的測試版中也已經(jīng)包含有正則表達式庫---java.util.regex。

故此現(xiàn)在我們有很多面向JAVA的正則表達式庫可供選擇,以下我將介紹兩個較具代表性的 Jakarta-ORO和java.util.regex,首先當(dāng)然是本人一直在用的 Jakarta-ORO:

Jakarta-ORO正則表達式庫

1.簡介:

Jakarta-ORO是最全面以及優(yōu)化得最好的正則表達式API之一,Jakarta-ORO庫以前叫做OROMatcher,是由Daniel F. Savarese編寫,后來他將其贈與Jakarta Project,讀者可在Apache.org的網(wǎng)站下載該API包。

許多源代碼開放的正則表達式庫都是支持Perl5兼容的正則表達式語法,Jakarta-ORO正則表達式庫也不例外,他與Perl 5正則表達式完全兼容。

2.對象與其方法:

★PatternCompiler對象:
我們在使用Jakarta-ORO API包時,最先要做的是,創(chuàng)建一個Perl5Compiler類的實例,并把它賦值給PatternCompiler接口對象。Perl5Compiler是PatternCompiler接口的一個實現(xiàn),允許你把正則表達式編譯成用來匹配的Pattern對象。

PatternCompiler compiler=new Perl5Compiler();

★Pattern對象:
要把所對應(yīng)的正則表達式編譯成Pattern對象,需要調(diào)用compiler對象的compile()方法,并在調(diào)用參數(shù)中指定正則表達式。舉個例子,你可以按照下面這種方式編譯正則表達式"s[ahkl]y":

Pattern pattern=null;
try {
pattern=compiler.compile("s[ahkl]y ");
} catch (MalformedPatternException e) {
e.printStackTrace();
}

在默認的情況下,編譯器會創(chuàng)建一個對大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配"say"、"shy"、 "sky"和"sly",但不匹配"Say"和"skY"。要創(chuàng)建一個大小寫不敏感的模式,你應(yīng)該在調(diào)用編譯器的時候指定一個額外的參數(shù):

pattern=compiler.compile("s[ahkl]y",Perl5Compiler.CASE_INSENSITIVE_MASK);

Pattern對象創(chuàng)建好之后,就可以通過PatternMatcher類用該Pattern對象進行模式匹配。

★PatternMatcher對象:

PatternMatcher對象依據(jù)Pattern對象和字符串展開匹配檢查。你要實例化一個Perl5Matcher類并把結(jié)果賦值給PatternMatcher接口。Perl5Matcher類是PatternMatcher接口的一個實現(xiàn),它根據(jù)Perl 5正則表達式語法進行模式匹配:
PatternMatcher matcher=new Perl5Matcher();

PatternMatcher對象提供了多個方法進行匹配操作,這些方法的第一個參數(shù)都是需要根據(jù)正則表達式進行匹配的字符串:

1、boolean matches(String input, Pattern pattern):當(dāng)要求輸入的字符串input和正則表達式pattern精確匹配時使用該方法。也就是說當(dāng)正則表達式完整地描述輸入字符串時返回真值。
2、boolean matchesPrefix(String input, Pattern pattern):要求正則表達式匹配輸入字符串起始部分時使用該方法。也就是說當(dāng)輸入字符串的起始部分與正則表達式匹配時返回真值。
3、boolean contains(String input, Pattern pattern):當(dāng)正則表達式要匹配輸入字符串的一部分時使用該方法。當(dāng)正則表達式為輸入字符串的子串時返回真值。

但以上三種方法只會查找輸入字符串中匹配正則表達式的第一個對象,如果當(dāng)字符串可能有多個子串匹配給定的正則表達式時,那么你就可以在調(diào)用上面三個方法時用PatternMatcherInput對象作為參數(shù)替代String對象,這樣就可以從字符串中最后一次匹配的位置開始繼續(xù)進行匹配,這樣就方便的多了。

用PatternMatcherInput對象作為參數(shù)替代String時,上述三個方法的語法如下:

  • boolean matches(PatternMatcherInput input, Pattern pattern)
  • boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
  • boolean contains(PatternMatcherInput input, Pattern pattern)

★Util.substitute()方法:
查找后需要要進行替換,我們就要用到Util.substitute()方法,其語法如下:

public static String substitute(PatternMatcher matcher,
Pattern pattern,Substitution sub,String input,
int numSubs)

前兩個參數(shù)分別為PatternMatcher和Pattern對象。而第三個參數(shù)是個Substiution對象,由它來決定替換操作如何進行。第四個參數(shù)是要進行替換操作的目標(biāo)字符串,最后一個參數(shù)用來指定是否替換模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只進行指定次數(shù)的替換。

在這里我相信有必要詳細解說一下第三個參數(shù)Substiution對象,因為它將決定替換將怎樣進行。

Substiution:
Substiution是一個接口類,它為你提供了在使用Util.substitute()方法時控制替換方式的手段,它有兩個標(biāo)準(zhǔn)的實現(xiàn)類:StringSubstitution與Perl5Substitution。當(dāng)然,同時你也可以生成自己的實現(xiàn)類來定制你所需要的特殊替換動作。

StringSubstitution:
StringSubstitution 實現(xiàn)的是簡單的純文字替換手段,它有兩個構(gòu)造方法:

StringSubstitution()->缺省的構(gòu)造方法,初始化一個包含零長度字符串的替換對象。

StringSubstitution(java.lang.String substitution)->初始化一個給定字符串的替換對象。

Perl5Substitution:
Perl5Substitution 是StringSubstitution的子類,它在實現(xiàn)純文字替換手段的同時也允許進行針對MATH類里各匹配組的PERL5變量的替換,所以他的替換手段比其直接父類StringSubstitution更為多元化。

它有三個構(gòu)造器:

Perl5Substitution()

Perl5Substitution(java.lang.String substitution)

Perl5Substitution(java.lang.String substitution, int numInterpolations)

前兩種構(gòu)造方法與StringSubstitution一樣,而第三種構(gòu)造方法下面將會介紹到。

在Perl5Substitution的替換字符串中可以包含用來替代在正則表達式里由小擴號圍起來的匹配組的變量,這些變量是由$1, $2,$3等形式來標(biāo)識。我們可以用一個例子來解釋怎樣使用替換變量來進行替換:

假設(shè)我們有正則表達式模式為b/d+:(也就是b[0-9]+:),而我們想把所有匹配的字符串中的"b"都改為"a",而":"則改為"-",而其余部分則不作修改,如我們輸入字符串為"EXAMPLE b123:",經(jīng)過替換后就應(yīng)該變成"EXAMPLE a123-"。要做到這點,我們就首先要把不做替換的部分用分組符號小括號包起來,這樣正則表達式就變?yōu)?b(/d+):",而構(gòu)造Perl5Substitution對象時其替換字符串就應(yīng)該是"a$1-",也就是構(gòu)造式為Perl5Substitution("a$1-"),表示在使用Util.substitute()方法時只要在目標(biāo)字符串里找到和正則表達式" b(/d+): "相匹配的子串都用替換字符串來替換,而變量$1表示如果和正則表達式里第一個組相匹配的內(nèi)容則照般原文插到$1所在的為置,如在"EXAMPLE b123:"中和正則表達式相匹配的部分是"b123:",而其中和第一分組"(/d+)"相匹配的部分則是"123",所以最后替換結(jié)果為"EXAMPLE a123-"。

有一點需要清楚的是,如果你把構(gòu)造器Perl5Substitution(java.lang.String substitution,int numInterpolations)

中的numInterpolations參數(shù)設(shè)為INTERPOLATE_ALL,那么當(dāng)每次找到一個匹配字串時,替換變量($1,$2等)所指向的內(nèi)容都根據(jù)目前匹配字串來更新,但是如果numInterpolations參數(shù)設(shè)為一個正整數(shù)N時,那么在替換時就只會在前N次匹配發(fā)生時替換變量會跟隨匹配對象來調(diào)整所代表的內(nèi)容,但N次之后就以一致以第N次替換變量所代表內(nèi)容來做為以后替換結(jié)果。

舉個例子會更好理解:

假如沿用以上例子中的正則表達式模式以及替換內(nèi)容來進行替換工作,設(shè)目標(biāo)字符串為"Tank b123: 85 Tank b256: 32 Tank b78: 22",并且設(shè)numInterpolations參數(shù)為INTERPOLATE_ALL,而Util.substitute()方法中的numSub變量設(shè)為SUBSTITUTE_ALL(請參考上文Util.substitute()方法內(nèi)容),那么你獲得的替換結(jié)果將會是:
Tank a123- 85 Tank a256- 32 Tank a78- 22

但是如果你把numInterpolations設(shè)為2,并且numSubs依然設(shè)為SUBSTITUTE_ALL,那么這時你獲得的結(jié)果則會是:
Tank a123- 85 Tank a256- 32 Tank a256- 22

你要注意到最后一個替換所用變量$1所代表的內(nèi)容與第二個$1一樣為"256",而不是預(yù)期的"78",因為在替換進行中,替換變量$1只根據(jù)匹配內(nèi)容進行了兩次更新,最后一次就使第二次匹配時所更新的結(jié)果,那么我們可以由此知道,如果numInterpolations設(shè)為1,那么結(jié)果將是:
Tank a123- 85 Tank a123- 32 Tank a123- 22

3.應(yīng)用示例:

剛好前段時間公司準(zhǔn)備出一個《伊索預(yù)言》的英語學(xué)習(xí)互動教材,其中有電子檔資料的整理工作,我們就以此為例來看一下Jakarta-ORO與JDBC2.0 API結(jié)合起來對數(shù)據(jù)庫內(nèi)的資料進行簡單提取與整理的實現(xiàn)。假設(shè)由錄入部的同事送過來的存放在MS SQLSERVER 7數(shù)據(jù)庫里的電子檔的表結(jié)構(gòu)如下(注:或許在不同的DBMS中有相應(yīng)的正則表達式的應(yīng)用,但這不在本文討論范圍內(nèi)):

表名:AESOP, 表中每條記錄包含有三列:

ID(int):單詞索引號
WORD(varchar):單詞
CONTENT(varchar):存放單詞的相關(guān)解釋與例句等內(nèi)容

其中CONTENT列中內(nèi)容的格式如下:
[音標(biāo)] [詞性] (解釋){(例句一/例句解釋/例句中該詞的詞性: 單詞在句中的意思) (例句二/例句解釋/例句中該詞的詞性: 單詞在句中的意思)}

如對應(yīng)單詞Kevin,CONTENT中的內(nèi)容如下:
['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞: 凱文)( Kevin is living in ZhuHai now./凱文現(xiàn)住在珠海/名詞: 凱文)}

我們的例子主要針對CONTENT列中內(nèi)容進行字符串處理。

★查找單個匹配:

首先,讓我們嘗試把CONTNET列中的[音標(biāo)]字段的內(nèi)容列示出來,由于所有單詞的記錄中都有這一項并且都在字串開始位置,所以這個查找工作比較簡單:

1、確定相應(yīng)的正則表達式:/[[^]]+/]
這個是很簡單的正則表達式,其意思是要求相匹配的字符串必須為以一對中括號包含的所有內(nèi)容,如['kevin] 、[名詞]等,但內(nèi)容中不包括"]"符號,也就是要避免出現(xiàn)"[][]"會作為一個匹配對象的情況出現(xiàn)(有關(guān)正則表達式的基礎(chǔ)知識請參照有關(guān)資料,這里不再詳述)。

注意,在Java中,你必須對每一個向前的斜杠("/")進行轉(zhuǎn)義處理。所以我們要在上面的正則表達式里每個"/"前面加上一個"/"以免出現(xiàn)編譯錯誤,也就是在JAVA中初始化正則表達式的字符串的語句應(yīng)該為:

String restring=" //[[^]]+//]";

并且在表達式里每個符號中間不能有空格,否則就會同樣出現(xiàn)編譯錯誤。

2、實例化PatternCompiler對象,創(chuàng)建Pattern對象
PatternCompiler compiler=new Perl5Compiler();

Pattern pattern=compiler.compile(restring);

3、創(chuàng)建PatternMatcher對象,調(diào)用PatternMatcher接口的contain()方法檢查匹配情況:

PatternMatcher matcher=new Perl5Matcher();
if (matcher.contains(content,pattern)) {
//處理代碼片段
}

這里matcher.contains(content,pattern)中的參數(shù) content是從數(shù)據(jù)庫里取來的字符串變量。該方法只會查到第一個匹配的對象字符串,但是由于音標(biāo)項均在CONETNET內(nèi)容字符串中的起始位置,所以用這個方法就已經(jīng)可以保證把每條記錄里的音標(biāo)項找出來了,但更為直接與合理的辦法是使用boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)方法,該方法驗證目標(biāo)字符串是否以正則表達式所匹配的字串為起始。

具體實現(xiàn)的完整的程序代碼如下:

package RegularExpressions;

//import……
import org.apache.oro.text.regex.*;


//使用Jakarta-ORO正則表達式庫前需要把它加到CLASSPATH里面,如果用IDE是//JBUILDER,那么也可以在JBUILDER里直接自建新庫。
public class yisuo {
 public static void main(String[] args) {
  try {
   //使用JDBC DRIVER進行DBMS連接,這里我使用的是一個第三方JDBC
   //DRIVER,Microsoft本身也有一個面向SQLSERVER7/2000的免費JDBC //DRIVER,但其性能真的是奇差,不用也罷。
   Class.forName("com.jnetdirect.jsql.JSQLDriver");

   Connection con = DriverManager.getConnection("jdbc:JSQLConnect://kevin:1433",
     "kevin chen", "re");
   Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
     ResultSet.CONCUR_UPDATABLE);

   //為使用Jakarta-ORO庫而創(chuàng)建相應(yīng)的對象
   String rsstring = " //[[^]]+//]";
   PatternCompiler orocom = new Perl5Compiler();
   Pattern pattern = orocom.compile(rsstring);
   PatternMatcher matcher = new Perl5Matcher();
   ResultSet uprs = stmt.executeQuery("SELECT * FROM aesop");

   while (uprs.next()) {
    Stirng word = uprs.getString("word");
    Stirng content = uprs.getString("content");

    if (matcher.contains(content, pattern)) {
     //或if(matcher.matchesPrefix(content,pattern)){
     MatchResult result = matcher.getMatch();
     Stirng pure = result.toString();
     System.out.println(word + "的音標(biāo)為:" + pure);
    }
   }
  } catch (Exception e) {
   System.out.println(e);
  }
 }
}

輸出結(jié)果為:kevin的音標(biāo)為['kevin]

在這個處理中我是用toString()方法來取得結(jié)果,但是如果正則表達式里是用了分組符號(圓括號),那么就可以用group(int gid)的方法來取得相應(yīng)各組匹配的結(jié)果,如正則表達式改為" (/[[^]]+/])",那么就可以用以下方法來取得結(jié)果:pure=result.group(0);

用程序驗證,輸出結(jié)果同樣為:kevin的音標(biāo)為['kevin]

而如果正則表達式為(/[[^]]+/])(/[[^]]+/]),則會查找到兩個連續(xù)的方括號所包含的內(nèi)容,也就找到[音標(biāo)] [詞性]兩項,但是兩項的結(jié)果分別在兩個組里面,分別由下面語句獲得結(jié)果:

result.group(0)->返回[音標(biāo)] [詞性]兩項內(nèi)容,也就是與整個正則表達式相匹配的結(jié)果字符串,在這里也就為['kevin] [名詞]

result.group(1) ->返回[音標(biāo)]項內(nèi)容,結(jié)果應(yīng)是['kevin]

result.group(2) ->返回[詞性]項內(nèi)容,結(jié)果應(yīng)是[名詞]

繼續(xù)用程序驗證,發(fā)現(xiàn)輸出并不正確,主要是當(dāng)內(nèi)容有中文時就不能成功匹配,考慮到可能是Jakarta-ORO正則表達式庫版本不支持中文的問題,回看一下原來我一直用的還是2.0.1的老版本,馬上到Jakarta.org上下載最新的2.0.4版本裝上再用程序驗證,得出的結(jié)果就和預(yù)期一樣正確。

★查找多個匹配:
經(jīng)過第一步的嘗試使用Jakarta-ORO后,我們已經(jīng)知道了如何正確使用該API包來查找目標(biāo)字符串里一個匹配的子串,下面我們接著來看一看當(dāng)目標(biāo)字符串里包含不止一個匹配的子串時我們?nèi)绾伟阉鼈円粋€接一個找出來進行相應(yīng)的處理。

首先我們先試個簡單的應(yīng)用,假設(shè)我們想把CONTNET字段內(nèi)容里所有用方括號包起來的字串都找出來,很清楚地,CONTNET字段的內(nèi)容里面就只有兩項匹配的內(nèi)容:[音標(biāo)]和 [詞性],剛才我們其實已經(jīng)把它們分別找出來了,但是我們所用的方法是分組方法,把"[音標(biāo)] [詞性]"作為一整個正則表達式匹配的內(nèi)容先找到,再根據(jù)分組把[音標(biāo)]和 [詞性]分別挑出來。但是現(xiàn)在我們需要做的是把[音標(biāo)]和[詞性]分別做為與同一個正則表達式匹配的內(nèi)容,先找到一個接著再找下一個,也就是剛才我們的表達式為(/[[^]]+/])(/[[^]]+/]),而現(xiàn)在應(yīng)為" /[[^]]+/] "。

我們已經(jīng)知道在匹配操作的三個方法里只要用PatternMatcherInput對象作為參數(shù)替代String對象就可以從字符串中最后一次匹配的位置開始繼續(xù)進行匹配,實現(xiàn)的程序片段如下:

PatternMatcherInput input=new PatternMatcherInput(content);
while (matcher.contains(input,pattern)) {
result=matcher.getMatch();
System.out.println(result.group(0))
}

輸出結(jié)果為:['kevin]

[名詞]

接著我們來做復(fù)雜一點的處理,就是我們要先把下面內(nèi)容:
['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞: 凱文)( Kevin is living in ZhuHai now. /凱文現(xiàn)住在珠海/名詞: 凱文)}中的整個例句部分(也就是由大括號所包含的部分)找出來,再分別把例句一和例句二找出,而各例句中的各項內(nèi)容(英文句、中文句、詞性、解釋)也要分項列出。

第一步當(dāng)然是要定出相應(yīng)的正則表達式,需要有兩個,一是和整個例句部分(也就是由大括號包起來的部分)匹配的正則表達式:"/{.+/}",
另一個則要和每個例句部分匹配(也就是小括號中的內(nèi)容),:/(([^)]+/)

而且由于要把例句的各項分離出來,所以要再把里面的各部分用分組的方法匹配出來:" ([^(]+)/(.+)/(.+):([^)]+) "。
為了簡便起見,我們不再和從數(shù)據(jù)庫里讀出,而是構(gòu)造一個包含同樣內(nèi)容的字符串變量,程序片段如下:

try{
String content="['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞:凱文) (Kevin is living in ZhuHai now./凱文現(xiàn)住在珠海/名詞: 凱文)}";
String ps1="http://{.+//}";
String ps2="http://([^)]+//)";
String ps3="([^(]+)/(.+)/(.+):([^)]+)";
String sentence;
PatternCompiler orocom=new Perl5Compiler();
Pattern pattern1=orocom.compile(ps1);
Pattern pattern2=orocom.compile(ps2);
Pattern pattern3=orocom.compile(ps3);
PatternMatcher matcher=new Perl5Matcher();
//先找出整個例句部分
if (matcher.contains(content,pattern1)) {
MatchResult result=matcher.getMatch();
String example=result.toString();
PatternMatcherInput input=new PatternMatcherInput(example);
//分別找出例句一和例句二
while (matcher.contains(input,pattern2)){
result=matcher.getMatch();
sentence=result.toString();
//把每個例句里的各項用分組的辦法分隔出來
if (matcher.contains(sentence,pattern3)){
result=matcher.getMatch();
System.out.println("英文句: "+result.group(1));
System.out.println("句子中文翻譯: "+result.group(2));
System.out.println("詞性: "+result.group(3));
System.out.println("意思: "+result.group(4));
}
}
}
}
catch(Exception e) {
System.out.println(e);
}

輸出結(jié)果為:
英文句: Kevin loves comic.
句子中文翻譯: 凱文愛漫畫
詞性: 名詞
意思: 凱文
英文句: Kevin is living in ZhuHai now.
句子中文翻譯: 凱文現(xiàn)住在珠海
詞性: 名詞
意思: 凱文

★查找替換:
以上的兩個應(yīng)用都是單純在查找字符串匹配方面的,我們再來看一下查找后如何對目標(biāo)字符串進行替換。

例如我現(xiàn)在想把第二個例句進行改動,換為:Kevin has seen《LEON》seveal times,because it is a good film./ 凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。

也就是把
['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞: 凱文)( Kevin is living in ZhuHai now. /凱文現(xiàn)住在珠海/名詞: 凱文)}

改為:
['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞: 凱文)( Kevin has seen《LEON》seveal times,because it is a good film./ 凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。)}

之前,我們已經(jīng)了解Util.substitute()方法與Substiution接口,以及Substiution的兩個實現(xiàn)類StringSubstitution和Perl5Substitution,我們就來看看怎么用Util.substitute()方法配合Perl5Substitution來完成我們上面提出的替換要求,確定正則表達式:

我們要先找到其中的整個例句部分,也就是由大括號包起來的字串,并且把兩個例句分別分組,所以正則表達式為:"/{(/([^)]+/))(/([^)]+/))/}",如果用替換變量來代替分組,那么上面的表達式可以看為"/{$1$2/}",這樣就可以更容易看出替換變量與分組間的關(guān)系。

根據(jù)上面的正則表達式Perl5Substitution類可以這樣構(gòu)造:
Perl5Substitution("{$1( Kevin has seen《LEON》seveal times,because it is a good film./ 凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。)}")

再根據(jù)這個Perl5Substitution對象來使用Util.substitute()方法便可以完成替換了,實現(xiàn)的代碼片段如下:

try{
String content="['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞: 凱文)(Kevin lives in ZhuHai now./凱文現(xiàn)住在珠海/名詞: 凱文)}";
String ps1="http://{(//([^)]+//))(//([^)]+//))//}";
String sentence;
String pure;
PatternCompiler orocom=new Perl5Compiler();
Pattern pattern1=orocom.compile(ps1);
PatternMatcher matcher=new Perl5Matcher();
String result=Util.substitute(matcher,
pattern1,new Perl5Substitution(
"{$1( Kevin has seen《LEON》seveal times,because it is a good film./ 凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。)}",1),
content,Util.SUBSTITUTE_ALL);
System.out.println(result);
}
catch(Exception e) {
System.out.println(e);
}

輸出結(jié)果是正確的,為:
['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞: 凱文)( Kevin has seen《LEON》seveal times,because it is a good film./ 凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。)}

至于有關(guān)使用numInterpolations參數(shù)的構(gòu)造器用法,讀者只要根據(jù)上面的介紹自己動手試一下就會清楚了,在此就不再例述。

總結(jié):

本文首先介紹了Jakarta-ORO正則表達式庫的對象與方法,并且接著舉例讓讀者對實際應(yīng)用有進一步的了解,雖然例子都比較簡單,但希望讀者們在看了該文后對Jakarta-ORO正則表達式庫有一定的認知,在實際工作中有所幫助與啟發(fā)。

其實在Jakarta org里除了Jakarta-ORO外還有一個百分百的純JAVA正則表達式庫,就是由Jonathan Locke贈與Jakarta ORG的Regexp,在該包里面包含了完整的文檔以及一個用于調(diào)試的Applet例子,對其有興趣的讀者可以到此下載。

參考資料:

本文的主要參考文章,該文在介紹Jakarta-ORO的同時也為讀者詳盡解析了正則表達式的基本語法。
一個基于PERL的正則表達式詳盡教程(雖然該教程是基于PERL的,但是你并不需要有PERL的經(jīng)驗,雖然那會有所幫助),以及一個不錯的正則表達式簡例教程。
最不可缺少的當(dāng)然是Jakarta-ORO的幫助文檔http://jakarta.apache.org/oro/api/

關(guān)于作者
陳廣佳 Kevin Chen,汕頭大學(xué)電子信息工程系工科學(xué)士,臺灣大新出版社珠海區(qū)開發(fā)部,現(xiàn)正圍繞中日韓電子資料使用JAVA開發(fā)電子詞典等相關(guān)項目??赏ㄟ^E-mail:cgjmail@163.net于他聯(lián)系。

java.util.regex篇

現(xiàn)在JDK1.4里終于有了自己的正則表達式API包,JAVA程序員可以免去找第三方提供的正則表達式庫的周折了,我們現(xiàn)在就馬上來了解一下這個SUN提供的遲來恩物- -對我來說確實如此。

1.簡介:

java.util.regex是一個用正則表達式所訂制的模式來對字符串進行匹配工作的類庫包。

它包括兩個類:Pattern和Matcher

Pattern 一個Pattern是一個正則表達式經(jīng)編譯后的表現(xiàn)模式。
Matcher 一個Matcher對象是一個狀態(tài)機器,它依據(jù)Pattern對象做為匹配模式對字符串展開匹配檢查。

首先一個Pattern實例訂制了一個所用語法與PERL的類似的正則表達式經(jīng)編譯后的模式,然后一個Matcher實例在這個給定的Pattern實例的模式控制下進行字符串的匹配工作。

以下我們就分別來看看這兩個類:

2.Pattern類:

Pattern的方法如下:

static Pattern compile(String regex)
將給定的正則表達式編譯并賦予給Pattern類
static Pattern compile(String regex, int flags)
同上,但增加flag參數(shù)的指定,可選的flag參數(shù)包括:CASE INSENSITIVE,MULTILINE,DOTALL,UNICODE CASE, CANON EQ
int flags()
返回當(dāng)前Pattern的匹配flag參數(shù).
Matcher matcher(CharSequence input)
生成一個給定命名的Matcher對象
static boolean matches(String regex, CharSequence input)
編譯給定的正則表達式并且對輸入的字串以該正則表達式為模開展匹配,該方法適合于該正則表達式只會使用一次的情況,也就是只進行一次匹配工作,因為這種情況下并不需要生成一個Matcher實例。
String pattern()
返回該Patter對象所編譯的正則表達式。
String[] split(CharSequence input)
將目標(biāo)字符串按照Pattern里所包含的正則表達式為模進行分割。
String[] split(CharSequence input, int limit)
作用同上,增加參數(shù)limit目的在于要指定分割的段數(shù),如將limi設(shè)為2,那么目標(biāo)字符串將根據(jù)正則表達式分為割為兩段。

一個正則表達式,也就是一串有特定意義的字符,必須首先要編譯成為一個Pattern類的實例,這個Pattern對象將會使用 matcher()方法來生成一個Matcher實例,接著便可以使用該 Matcher實例以編譯的正則表達式為基礎(chǔ)對目標(biāo)字符串進行匹配工作,多個Matcher是可以共用一個Pattern對象的。

現(xiàn)在我們先來看一個簡單的例子,再通過分析它來了解怎樣生成一個Pattern對象并且編譯一個正則表達式,最后根據(jù)這個正則表達式將目標(biāo)字符串進行分割:

import java.util.regex.*;
public class Replacement{
public static void main(String[] args) throws Exception {
// 生成一個Pattern,同時編譯一個正則表達式
Pattern p = Pattern.compile("[/]+");
//用Pattern的split()方法把字符串按"/"分割
String[] result = p.split(
"Kevin has seen《LEON》seveal times,because it is a good film."
+"/ 凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部"
+"好電影。/名詞:凱文。");
for (int i=0; i<result.length; i++)
System.out.println(result[i]);
}
}

輸出結(jié)果為:

Kevin has seen《LEON》seveal times,because it is a good film.
凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部好電影。
名詞:凱文。

很明顯,該程序?qū)⒆址?/"進行了分段,我們以下再使用 split(CharSequence input, int limit)方法來指定分段的段數(shù),程序改動為:

tring[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film./ 凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。",2);

這里面的參數(shù)"2"表明將目標(biāo)語句分為兩段。

輸出結(jié)果則為:

Kevin has seen《LEON》seveal times,because it is a good film.

凱文已經(jīng)看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。

由上面的例子,我們可以比較出java.util.regex包在構(gòu)造Pattern對象以及編譯指定的正則表達式的實現(xiàn)手法與我們在上一篇中所介紹的Jakarta-ORO 包在完成同樣工作時的差別,Jakarta-ORO 包要先構(gòu)造一個PatternCompiler類對象接著生成一個Pattern對象,再將正則表達式用該PatternCompiler類的compile()方法來將所需的正則表達式編譯賦予Pattern類:

PatternCompiler orocom=new Perl5Compiler();
Pattern pattern=orocom.compile("REGULAR EXPRESSIONS");
PatternMatcher matcher=new Perl5Matcher();

但是在java.util.regex包里,我們僅需生成一個Pattern類,直接使用它的compile()方法就可以達到同樣的效果:
Pattern p = Pattern.compile("[/]+");

因此似乎java.util.regex的構(gòu)造法比Jakarta-ORO更為簡潔并容易理解。

3.Matcher類:

Matcher方法如下:

Matcher appendReplacement(StringBuffer sb, String replacement)
將當(dāng)前匹配子串替換為指定字符串,并且將替換后的子串以及其之前到上次匹配子串之后的字符串段添加到一個StringBuffer對象里。
StringBuffer appendTail(StringBuffer sb)
將最后一次匹配工作后剩余的字符串添加到一個StringBuffer對象里。
int end()
返回當(dāng)前匹配的子串的最后一個字符在原目標(biāo)字符串中的索引位置 。
int end(int group)
返回與匹配模式里指定的組相匹配的子串最后一個字符的位置。
boolean find()
嘗試在目標(biāo)字符串里查找下一個匹配子串。
boolean find(int start)
重設(shè)Matcher對象,并且嘗試在目標(biāo)字符串里從指定的位置開始查找下一個匹配的子串。
String group()
返回當(dāng)前查找而獲得的與組匹配的所有子串內(nèi)容
String group(int group)
返回當(dāng)前查找而獲得的與指定的組匹配的子串內(nèi)容
int groupCount()
返回當(dāng)前查找所獲得的匹配組的數(shù)量。
boolean lookingAt()
檢測目標(biāo)字符串是否以匹配的子串起始。
boolean matches()
嘗試對整個目標(biāo)字符展開匹配檢測,也就是只有整個目標(biāo)字符串完全匹配時才返回真值。
Pattern pattern()
返回該Matcher對象的現(xiàn)有匹配模式,也就是對應(yīng)的Pattern 對象。
String replaceAll(String replacement)
將目標(biāo)字符串里與既有模式相匹配的子串全部替換為指定的字符串。
String replaceFirst(String replacement)
將目標(biāo)字符串里第一個與既有模式相匹配的子串替換為指定的字符串。
Matcher reset()
重設(shè)該Matcher對象。
Matcher reset(CharSequence input)
重設(shè)該Matcher對象并且指定一個新的目標(biāo)字符串。
int start()
返回當(dāng)前查找所獲子串的開始字符在原目標(biāo)字符串中的位置。
int start(int group)
返回當(dāng)前查找所獲得的和指定組匹配的子串的第一個字符在原目標(biāo)字符串中的位置。

(光看方法的解釋是不是很不好理解?不要急,待會結(jié)合例子就比較容易明白了)

一個Matcher實例是被用來對目標(biāo)字符串進行基于既有模式(也就是一個給定的Pattern所編譯的正則表達式)進行匹配查找的,所有往Matcher的輸入都是通過CharSequence接口提供的,這樣做的目的在于可以支持對從多元化的數(shù)據(jù)源所提供的數(shù)據(jù)進行匹配工作。

我們分別來看看各方法的使用:

★matches()/lookingAt ()/find():
一個Matcher對象是由一個Pattern對象調(diào)用其matcher()方法而生成的,一旦該Matcher對象生成,它就可以進行三種不同的匹配查找操作:

  1. matches()方法嘗試對整個目標(biāo)字符展開匹配檢測,也就是只有整個目標(biāo)字符串完全匹配時才返回真值。
  2. lookingAt ()方法將檢測目標(biāo)字符串是否以匹配的子串起始。
  3. find()方法嘗試在目標(biāo)字符串里查找下一個匹配子串。

以上三個方法都將返回一個布爾值來表明成功與否。

★replaceAll ()/appendReplacement()/appendTail():

Matcher類同時提供了四個將匹配子串替換成指定字符串的方法:

  1. replaceAll()
  2. replaceFirst()
  3. appendReplacement()
  4. appendTail()

replaceAll()與replaceFirst()的用法都比較簡單,請看上面方法的解釋。我們主要重點了解一下appendReplacement()和appendTail()方法。

appendReplacement(StringBuffer sb, String replacement) 將當(dāng)前匹配子串替換為指定字符串,并且將替換后的子串以及其之前到上次匹配子串之后的字符串段添加到一個StringBuffer對象里,而appendTail(StringBuffer sb) 方法則將最后一次匹配工作后剩余的字符串添加到一個StringBuffer對象里。

例如,有字符串fatcatfatcatfat,假設(shè)既有正則表達式模式為"cat",第一次匹配后調(diào)用appendReplacement(sb,"dog"),那么這時StringBuffer sb的內(nèi)容為fatdog,也就是fatcat中的cat被替換為dog并且與匹配子串前的內(nèi)容加到sb里,而第二次匹配后調(diào)用appendReplacement(sb,"dog"),那么sb的內(nèi)容就變?yōu)閒atdogfatdog,如果最后再調(diào)用一次appendTail(sb),那么sb最終的內(nèi)容將是fatdogfatdogfat。

還是有點模糊?那么我們來看個簡單的程序:

//該例將把句子里的"Kelvin"改為"Kevin"
import java.util.regex.*;
public class MatcherTest{
public static void main(String[] args)
throws Exception {
//生成Pattern對象并且編譯一個簡單的正則表達式"Kelvin"
Pattern p = Pattern.compile("Kevin");
//用Pattern類的matcher()方法生成一個Matcher對象
Matcher m = p.matcher("Kelvin Li and Kelvin Chan are both working in Kelvin Chen's KelvinSoftShop company");
StringBuffer sb = new StringBuffer();
int i=0;
//使用find()方法查找第一個匹配的對象
boolean result = m.find();
//使用循環(huán)將句子里所有的kelvin找出并替換再將內(nèi)容加到sb里
while(result) {
i++;
m.appendReplacement(sb, "Kevin");
System.out.println("第"+i+"次匹配后sb的內(nèi)容是:"+sb);
//繼續(xù)查找下一個匹配對象
result = m.find();
}
//最后調(diào)用appendTail()方法將最后一次匹配后的剩余字符串加到sb里;
m.appendTail(sb);
System.out.println("調(diào)用m.appendTail(sb)后sb的最終內(nèi)容是:"+ sb.toString());
}
}

最終輸出結(jié)果為:
第1次匹配后sb的內(nèi)容是:Kevin
第2次匹配后sb的內(nèi)容是:Kevin Li and Kevin
第3次匹配后sb的內(nèi)容是:Kevin Li and Kevin Chan are both working in Kevin
第4次匹配后sb的內(nèi)容是:Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin
調(diào)用m.appendTail(sb)后sb的最終內(nèi)容是:Kevin Li and Kevin Chan are both working in Kevin Chen's KevinSoftShop company.

看了上面這個例程是否對appendReplacement(),appendTail()兩個方法的使用更清楚呢,如果還是不太肯定最好自己動手寫幾行代碼測試一下。

★group()/group(int group)/groupCount():
該系列方法與我們在上篇介紹的Jakarta-ORO中的MatchResult .group()方法類似(有關(guān)Jakarta-ORO請參考上篇的內(nèi)容),都是要返回與組匹配的子串內(nèi)容,下面代碼將很好解釋其用法:

import java.util.regex.*;
public class GroupTest{
public static void main(String[] args)
throws Exception {
Pattern p = Pattern.compile("(ca)(t)");
Matcher m = p.matcher("one cat,two cats in the yard");
StringBuffer sb = new StringBuffer();
boolean result = m.find();
System.out.println("該次查找獲得匹配組的數(shù)量為:"+m.groupCount());
for(int i=1;i<=m.groupCount();i++){
System.out.println("第"+i+"組的子串內(nèi)容為: "+m.group(i));
}
}
}

輸出為:
該次查找獲得匹配組的數(shù)量為:2
第1組的子串內(nèi)容為:ca
第2組的子串內(nèi)容為:t

Matcher對象的其他方法因比較好理解且由于篇幅有限,請讀者自己編程驗證。

4.一個檢驗Email地址的小程序:
最后我們來看一個檢驗Email地址的例程,該程序是用來檢驗一個輸入的EMAIL地址里所包含的字符是否合法,雖然這不是一個完整的EMAIL地址檢驗程序,它不能檢驗所有可能出現(xiàn)的情況,但在必要時您可以在其基礎(chǔ)上增加所需功能。

import java.util.regex.*;
public class Email {
public static void main(String[] args) throws Exception {
String input = args[0];
//檢測輸入的EMAIL地址是否以 非法符號"."或"@"作為起始字符
Pattern p = Pattern.compile("^//.|^//@");
Matcher m = p.matcher(input);
if (m.find()){
System.err.println("EMAIL地址不能以'.'或'@'作為起始字符");
}
//檢測是否以"www."為起始
p = Pattern.compile("^www//.");
m = p.matcher(input);
if (m.find()) {
System.out.println("EMAIL地址不能以'www.'起始");
}
//檢測是否包含非法字符
p = Pattern.compile("[^A-Za-z0-9//.//@_//-~#]+");
m = p.matcher(input);
StringBuffer sb = new StringBuffer();
boolean result = m.find();
boolean deletedIllegalChars = false;
while(result) {
//如果找到了非法字符那么就設(shè)下標(biāo)記
deletedIllegalChars = true;
//如果里面包含非法字符如冒號雙引號等,那么就把他們消去,加到SB里面
m.appendReplacement(sb, "");
result = m.find();
}
m.appendTail(sb);
input = sb.toString();
if (deletedIllegalChars) {
System.out.println("輸入的EMAIL地址里包含有冒號、逗號等非法字符,請修改");
System.out.println("您現(xiàn)在的輸入為: "+args[0]);
System.out.println("修改后合法的地址應(yīng)類似: "+input);
}
}
}

例如,我們在命令行輸入:java Email www.kevin@163.net

那么輸出結(jié)果將會是:EMAIL地址不能以'www.'起始

如果輸入的EMAIL為@kevin@163.net

則輸出為:EMAIL地址不能以'.'或'@'作為起始字符

當(dāng)輸入為:cgjmail#$%@163.net

那么輸出就是:

輸入的EMAIL地址里包含有冒號、逗號等非法字符,請修改
您現(xiàn)在的輸入為: cgjmail#$%@163.net
修改后合法的地址應(yīng)類似: cgjmail@163.net

5.總結(jié):
本文介紹了jdk1.4.0-beta3里正則表達式庫--java.util.regex中的類以及其方法,如果結(jié)合與上一篇中所介紹的Jakarta-ORO API作比較,讀者會更容易掌握該API的使用,當(dāng)然該庫的性能將在未來的日子里不斷擴展,希望獲得最新信息的讀者最好到及時到SUN的網(wǎng)站去了解。

6.結(jié)束語:
本來計劃再多寫一篇介紹一下需付費的正則表達式庫中較具代表性的作品,但覺得既然有了免費且優(yōu)秀的正則表達式庫可以使用,何必還要去找需付費的呢,相信很多讀者也是這么想的:,所以有興趣了解更多其他的第三方正則表達式庫的朋友可以自己到網(wǎng)上查找或者到我在參考資料里提供的網(wǎng)址去看看。

參考資料

java.util.regex的幫助文檔
Dana Nourie 和Mike McCloskey所寫的Regular Expressions and the Java" Programming Language
需要更多的第三方正則表達式資源以及基于它們所開發(fā)的應(yīng)用程序請看

相關(guān)文章

最新評論

3344免费偷拍视频| 一级A一级a爰片免费免会员| 成人资源在线观看免费官网| 毛片av在线免费看| 在线制服丝袜中文字幕| 国产真实灌醉下药美女av福利| 亚洲日本一区二区久久久精品| 五月色婷婷综合开心网4438| 91九色国产熟女一区二区| 老有所依在线观看完整版| 国产黑丝高跟鞋视频在线播放 | 天天摸天天亲天天舔天天操天天爽| 丝袜肉丝一区二区三区四区在线 | 欧美女同性恋免费a| 日本精品一区二区三区在线视频。| 在线观看视频一区麻豆| 日韩欧美一级黄片亚洲| av在线播放国产不卡| 久久99久久99精品影院| 天干天天天色天天日天天射| 首之国产AV医生和护士小芳| 亚洲一区制服丝袜美腿| 欧美精产国品一二三区| 国产女人被做到高潮免费视频| 日韩特级黄片高清在线看| 免费黄页网站4188| 女生被男生插的视频网站| 亚洲av色图18p| 亚洲美女高潮喷浆视频| 国产精彩福利精品视频| 高清成人av一区三区| 日本一区二区三区免费小视频| 看一级特黄a大片日本片黑人| 女同性ⅹxx女同h偷拍| 欧美精产国品一二三产品价格| 一个人免费在线观看ww视频| www久久久久久久久久久| tube69日本少妇| 激情综合治理六月婷婷| 久久99久久99精品影院| 午夜精品福利一区二区三区p | 在线观看av亚洲情色| 久久这里只有精彩视频免费| 93视频一区二区三区| 青青草视频手机免费在线观看| 天天日天天添天天爽| 天天插天天狠天天操| 青青青青在线视频免费观看| 成熟熟女国产精品一区| 亚洲第17页国产精品| 天堂资源网av中文字幕| 中文字幕午夜免费福利视频| 欧美日本aⅴ免费视频| 亚洲成人激情视频免费观看了| 懂色av之国产精品| 这里只有精品双飞在线播放| 黑人大几巴狂插日本少妇| 天堂av在线播放免费| 神马午夜在线观看视频| 精品一区二区亚洲欧美| 3337p日本欧洲大胆色噜噜| 亚洲丝袜老师诱惑在线观看| 亚洲一区二区久久久人妻| 午夜福利资源综合激情午夜福利资| rct470中文字幕在线| 91成人在线观看免费视频| 动漫av网站18禁| 青青青青青免费视频| 成人av久久精品一区二区| 青青青青青免费视频| 美女av色播在线播放| 动漫黑丝美女的鸡巴| 久久久精品999精品日本| 欧美日韩高清午夜蜜桃大香蕉| 可以在线观看的av中文字幕| av欧美网站在线观看| 男女之间激情网午夜在线| 天干天天天色天天日天天射| 国产一级麻豆精品免费| 亚洲av在线观看尤物| 中文字幕高清免费在线人妻| 骚逼被大屌狂草视频免费看| 色97视频在线播放| 在线观看av亚洲情色| 在线观看操大逼视频| 黄色视频在线观看高清无码| 国产剧情演绎系列丝袜高跟| 国产高清97在线观看视频| aⅴ精产国品一二三产品| 国产chinesehd精品麻豆| 亚洲码av无色中文| gogo国模私拍视频| 中文字日产幕乱六区蜜桃| 日辽宁老肥女在线观看视频| 天天色天天操天天舔| 欧美日韩一级黄片免费观看| 中文人妻AV久久人妻水| 国产麻豆乱子伦午夜视频观看| 人妻少妇av在线观看| 91免费黄片可看视频| 99精品免费久久久久久久久a| 精品一区二区亚洲欧美| 青青草成人福利电影| 成人在线欧美日韩国产| 中出中文字幕在线观看| 亚洲视频乱码在线观看| 青青青激情在线观看视频| 午夜91一区二区三区| 欧美国品一二三产区区别| 韩国女主播精品视频网站| 黄色录像鸡巴插进去| 亚洲av男人的天堂你懂的| 一本久久精品一区二区| 伊人成人在线综合网| 北条麻妃肉色丝袜视频| 五十路熟女av天堂| 亚洲另类综合一区小说| 亚洲天堂第一页中文字幕| 国产精品久久久久久美女校花| av破解版在线观看| 午夜久久香蕉电影网| 天天日夜夜干天天操| 99久久99久国产黄毛片| 国产精品入口麻豆啊啊啊| 国产一区成人在线观看视频| 国产成人小视频在线观看无遮挡| 国产精品久久久久国产三级试频 | 天天想要天天操天天干| 亚洲免费国产在线日韩| 老熟妇凹凸淫老妇女av在线观看| 自拍偷区二区三区麻豆| 亚洲成人av一区在线| 中文字幕免费在线免费| 11久久久久久久久久久| aaa久久久久久久久| 98视频精品在线观看| 97成人免费在线观看网站| av亚洲中文天堂字幕网| 99热99re在线播放| 欧美日本在线视频一区| 护士特殊服务久久久久久久| 99精品国产免费久久| 精品久久久久久高潮| 欧美一区二区三区啪啪同性| 日韩欧美亚洲熟女人妻| 蜜桃视频17c在线一区二区| 中文字幕一区二区三区蜜月| 欧美综合婷婷欧美综合| 午夜精品一区二区三区福利视频| 91精品免费久久久久久| 熟女91pooyn熟女| 夜夜骑夜夜操夜夜奸| 国产美女一区在线观看| 久久精品国产亚洲精品166m| 国产三级精品三级在线不卡| 中文字幕亚洲久久久| 日日夜夜狠狠干视频| 五十路息与子猛烈交尾视频 | 特一级特级黄色网片| 91人妻精品一区二区在线看| 中文字幕日韩精品就在这里| 日韩成人性色生活片| 在线免费观看黄页视频| 亚洲欧美综合在线探花| 免费观看丰满少妇做受| 亚洲午夜精品小视频| 99re6热在线精品| yellow在线播放av啊啊啊| 亚洲 图片 欧美 图片| 边摸边做超爽毛片18禁色戒 | 做爰视频毛片下载蜜桃视频1| 国产精品久久久久国产三级试频| 久久机热/这里只有| 欧美成人一二三在线网| 精品91高清在线观看| 99视频精品全部15| 欧美一区二区三区高清不卡tv| 国产大鸡巴大鸡巴操小骚逼小骚逼| 懂色av之国产精品| 绝顶痉挛大潮喷高潮无码 | 一区二区麻豆传媒黄片| 999九九久久久精品| 日本欧美视频在线观看三区| 国产真实乱子伦a视频| 人妻熟女在线一区二区| 又大又湿又爽又紧A视频| 欧美香蕉人妻精品一区二区| 91精品国产综合久久久蜜| 91久久人澡人人添人人爽乱| 日韩人妻在线视频免费| 国产女人被做到高潮免费视频 | 偷拍自拍亚洲视频在线观看| 欧美一区二区三区久久久aaa| 91老师蜜桃臀大屁股| 91香蕉成人app下载| 国产91精品拍在线观看| 日日操综合成人av| 在线观看免费视频色97| 欧美一区二区三区四区性视频| 蜜臀av久久久久蜜臀av麻豆| 青青草原网站在线观看| 亚洲欧美综合在线探花| 蝴蝶伊人久久中文娱乐网| 激情伦理欧美日韩中文字幕| 男女啪啪视频免费在线观看| 国产一区二区久久久裸臀| 亚洲精品在线资源站| 日本一区美女福利视频| 免费黄高清无码国产| 91国产在线视频免费观看| 激情国产小视频在线| 久久久久久97三级| 日韩精品二区一区久久| 亚洲国产精品黑丝美女| 亚洲嫩模一区二区三区| 91老师蜜桃臀大屁股| 国产白嫩美女一区二区| gav成人免费播放| 男人插女人视频网站| 动色av一区二区三区| 国产第一美女一区二区三区四区 | 91久久综合男人天堂| 国产在线免费观看成人| 成人影片高清在线观看| 日比视频老公慢点好舒服啊| 亚洲免费在线视频网站| 国产精品入口麻豆啊啊啊 | 日本精品视频不卡一二三| 日本一道二三区视频久久| 国产精品探花熟女在线观看| 天天日天天做天天日天天做| 75国产综合在线视频| 天天日天天干天天插舔舔| 午夜精品亚洲精品五月色| 综合页自拍视频在线播放| 99久久超碰人妻国产| 国产视频精品资源网站| 精产国品久久一二三产区区别| 国产97在线视频观看| 亚洲老熟妇日本老妇| 欧美日韩一区二区电影在线观看| 午夜精品一区二区三区更新| 少妇人妻久久久久视频黄片| 国产精品国产三级国产午| 不卡一不卡二不卡三| 天天插天天色天天日| 天天日天天操天天摸天天舔 | 91香蕉成人app下载| 福利午夜视频在线合集| 偷拍自拍亚洲美腿丝袜| 亚洲va天堂va国产va久| 99国内小视频在现欢看| 国产免费av一区二区凹凸四季| 一本久久精品一区二区| 91天堂精品一区二区| 一区二区三区另类在线| 91亚洲手机在线视频播放| 337p日本大胆欧美人| 精品一区二区亚洲欧美| av手机免费在线观看高潮| 亚洲最大黄了色网站| 亚洲美女自偷自拍11页| 亚洲中文字幕校园春色| 久精品人妻一区二区三区| 青青尤物在线观看视频网站| 国产日本欧美亚洲精品视| 久久热久久视频在线观看| 中文字幕在线视频一区二区三区 | 大鸡吧插逼逼视频免费看| 中文字幕一区二区自拍| 51国产偷自视频在线播放| 久久久久久性虐视频| 丝袜肉丝一区二区三区四区在线看| 色吉吉影音天天干天天操| 黄片大全在线观看观看| 成人av免费不卡在线观看| 99国内小视频在现欢看| 日本人妻精品久久久久久| 偷偷玩弄新婚人妻h视频| 天天日天天天天天天天天天天| 天天爽夜夜爽人人爽QC| 亚洲第一伊人天堂网| 综合页自拍视频在线播放| 亚洲一区二区三区在线高清| 亚洲人妻av毛片在线| 久草视频首页在线观看| av破解版在线观看| 岛国毛片视频免费在线观看| 人妻无码色噜噜狠狠狠狠色| 亚洲高清一区二区三区视频在线| 在线免费观看靠比视频的网站| 夏目彩春在线中文字幕| 91亚洲手机在线视频播放| jul—619中文字幕在线| yellow在线播放av啊啊啊 | 日本熟女50视频免费| aⅴ精产国品一二三产品| 人妻爱爱 中文字幕| 99亚洲美女一区二区三区| 亚洲视频乱码在线观看| www天堂在线久久| 国产熟妇人妻ⅹxxxx麻豆| 成人高潮aa毛片免费| 热久久只有这里有精品| 国产视频一区在线观看| 男人和女人激情视频| 亚洲自拍偷拍综合色| 老有所依在线观看完整版| 亚洲欧美清纯唯美另类| 91中文字幕免费在线观看| 国产成人精品福利短视频| 国产黄色高清资源在线免费观看| 日本韩国在线观看一区二区| 性色蜜臀av一区二区三区| av黄色成人在线观看| 精品久久久久久高潮| 日韩欧美一级aa大片| 日本五十路熟新垣里子| 日韩美在线观看视频黄| 国产精品亚洲а∨天堂免| 日韩国产乱码中文字幕| 日本女人一级免费片| 亚洲日本一区二区三区 | 91av中文视频在线| 亚洲成人黄色一区二区三区| 在线视频自拍第三页| 亚国产成人精品久久久| 成人国产影院在线观看| 欧美80老妇人性视频| 视频二区在线视频观看| 青青青艹视频在线观看| 亚洲av色香蕉一区二区三区| 丝袜亚洲另类欧美变态| 91精品国产综合久久久蜜| 日本韩国亚洲综合日韩欧美国产| 强行扒开双腿猛烈进入免费版| 综合一区二区三区蜜臀| 伊拉克及约旦宣布关闭领空| 国产日韩精品一二三区久久久| 韩国黄色一级二级三级| 色呦呦视频在线观看视频| 日韩精品中文字幕播放| 亚洲av无硬久久精品蜜桃| 亚洲成人国产综合一区| 中文字幕在线一区精品| 免费手机黄页网址大全| 宅男噜噜噜666免费观看| 国产一区成人在线观看视频 | 国产精品黄大片在线播放| 欧美成人综合色在线噜噜| 免费在线福利小视频| 国产一级精品综合av| 最近中文2019年在线看| 天天操天天干天天日狠狠插| 一级黄色片夫妻性生活| 亚洲国产成人最新资源| 91人妻精品一区二区久久| 亚洲中文字幕国产日韩| 最后99天全集在线观看| free性日本少妇| 韩国男女黄色在线观看| 噜噜色噜噜噜久色超碰| 夏目彩春在线中文字幕| av完全免费在线观看av| 大香蕉福利在线观看| 97国产在线观看高清| 小泽玛利亚视频在线观看| 69精品视频一区二区在线观看| 日韩一个色综合导航| 色偷偷伊人大杳蕉综合网| 99热这里只有国产精品6| 亚洲精品久久综合久| 人妻无码中文字幕专区| 77久久久久国产精产品| 国产黄网站在线观看播放| 欧美日韩不卡一区不区二区| 韩国男女黄色在线观看| 日本少妇的秘密免费视频| 在线观看免费岛国av| 亚洲av午夜免费观看| 色综合久久五月色婷婷综合| 欧美成人精品在线观看| 九色精品视频在线播放| 888欧美视频在线| 欧美一区二区三区乱码在线播放 | 亚洲国产美女一区二区三区软件| 日本少妇人妻xxxxx18| 91人妻精品一区二区久久| av在线免费观看亚洲天堂| 91久久国产成人免费网站| 国产麻豆乱子伦午夜视频观看| 国产普通话插插视频| 一区二区三区毛片国产一区| 天天干天天操天天扣| 久草免费人妻视频在线| 日韩伦理短片在线观看| 国产亚洲精品视频合集| 日韩欧美亚洲熟女人妻| av新中文天堂在线网址| 国语对白xxxx乱大交| 精品91高清在线观看| 视频在线亚洲一区二区| 福利午夜视频在线观看| 精品成人午夜免费看| 在线免费91激情四射 | 欧美黑人性暴力猛交喷水| 午夜精品久久久久久99热| 五月天久久激情视频| 欧美viboss性丰满| 亚洲成人熟妇一区二区三区 | 天天操天天射天天操天天天| 宅男噜噜噜666免费观看| 伊人开心婷婷国产av| 超pen在线观看视频公开97 | 少妇一区二区三区久久久| 93人妻人人揉人人澡人人| 直接能看的国产av| 亚洲人妻视频在线网| 亚洲成人线上免费视频观看| 婷婷色中文亚洲网68| 国产亚洲天堂天天一区| 亚洲熟色妇av日韩熟色妇在线| 亚洲 中文 自拍 另类 欧美| 熟女在线视频一区二区三区| 国产高清在线在线视频| 天天干天天爱天天色| 免费av岛国天堂网站| 免费在线观看视频啪啪| 好了av中文字幕在线| heyzo蜜桃熟女人妻| 999九九久久久精品| 97精品视频在线观看| 亚洲欧美激情国产综合久久久 | 超黄超污网站在线观看| 国产美女一区在线观看| 亚洲在线免费h观看网站| 任你操视频免费在线观看| 日本黄色特一级视频| 欧美精品一二三视频| 四川五十路熟女av| 亚洲日产av一区二区在线| 青青草原色片网站在线观看| 啊啊啊想要被插进去视频| 成人资源在线观看免费官网| av日韩在线观看大全| av俺也去在线播放| 日本欧美视频在线观看三区| 日本后入视频在线观看| 一本一本久久a久久精品综合不卡 亚洲另类综合一区小说 | 免费看美女脱光衣服的视频| 亚洲中文精品人人免费| 不卡精品视频在线观看| 啊啊好大好爽啊啊操我啊啊视频| 亚国产成人精品久久久| 亚洲精品福利网站图片| 青娱乐极品视频青青草| 国产在线观看免费人成短视频| 丝袜美腿欧美另类 中文字幕| 男人天堂最新地址av| 国产高清精品极品美女| av在线资源中文字幕| 自拍偷拍一区二区三区图片| 日本少妇在线视频大香蕉在线观看| 99久久中文字幕一本人| 成人av亚洲一区二区| 亚洲变态另类色图天堂网| 久久精品亚洲成在人线a| 粉嫩欧美美人妻小视频| 在线视频自拍第三页| 亚洲av午夜免费观看| 97精品综合久久在线| 久久久久久久99精品| 免费av岛国天堂网站| 免费男阳茎伸入女阳道视频| 中文字幕在线免费第一页| 色哟哟在线网站入口| 国产精品久久9999| 成年午夜免费无码区| 精品亚洲国产中文自在线| 精品久久久久久久久久久99| 欧美成人小视频在线免费看| 熟女在线视频一区二区三区| 欧洲黄页网免费观看| 果冻传媒av一区二区三区 | 亚洲麻豆一区二区三区| 女同性ⅹxx女同hd| 老熟妇凹凸淫老妇女av在线观看| 午夜精品亚洲精品五月色| 亚洲一级美女啪啪啪| 久久久超爽一二三av| 91www一区二区三区| 日本人妻少妇18—xx| 精品av国产一区二区三区四区| 又粗又硬又猛又黄免费30| 国产高清97在线观看视频| 视频一区 视频二区 视频| 日本一本午夜在线播放| 19一区二区三区在线播放| 精品91高清在线观看| 果冻传媒av一区二区三区| 亚洲欧美国产麻豆综合| 亚洲国产精品黑丝美女| 亚洲中文字幕国产日韩| 国产丰满熟女成人视频| 亚洲国产精品美女在线观看| av在线免费中文字幕| 黄色录像鸡巴插进去| 3344免费偷拍视频| 中文字幕在线观看国产片| 天天色天天操天天舔| 老司机午夜精品视频资源 | 亚洲女人的天堂av| 久久久超爽一二三av| 欧美色呦呦最新网址| 亚洲一区二区久久久人妻| 国产97视频在线精品| 2025年人妻中文字幕乱码在线| 免费大片在线观看视频网站| 国产精品久久久黄网站| 成人H精品动漫在线无码播放| 红杏久久av人妻一区| 亚洲福利天堂久久久久久| 日韩a级黄色小视频| caoporm超碰国产| 日本午夜爽爽爽爽爽视频在线观看 | 亚洲午夜在线视频福利| 亚洲高清一区二区三区视频在线| 青青草原色片网站在线观看| 欧美特级特黄a大片免费| aⅴ精产国品一二三产品| 免费高清自慰一区二区三区网站 | 日本高清在线不卡一区二区| 色狠狠av线不卡香蕉一区二区| 中文字幕日韩91人妻在线| 不卡精品视频在线观看| 天天日天天干天天要| 端庄人妻堕落挣扎沉沦| 视频一区二区在线免费播放| 国产高清在线观看1区2区| 青青草国内在线视频精选| 日本中文字幕一二区视频| 天美传媒mv视频在线观看| 不卡一不卡二不卡三| 国产精品久久综合久久| 国产午夜无码福利在线看| 91人妻精品一区二区久久| 亚洲欧美一区二区三区电影| 伊人综合免费在线视频| 免费男阳茎伸入女阳道视频| 午夜久久香蕉电影网| 毛片一级完整版免费| 91精品国产麻豆国产| 免费福利av在线一区二区三区| 91精品激情五月婷婷在线| 亚洲自拍偷拍综合色| 人人妻人人爽人人澡人人精品| 大鸡吧插逼逼视频免费看| 亚洲码av无色中文| 久久久精品999精品日本| 国产成人精品午夜福利训2021| 天天日天天日天天擦| 伊拉克及约旦宣布关闭领空| 粉嫩av懂色av蜜臀av| 99精品国产自在现线观看| 99一区二区在线观看| 高潮视频在线快速观看国家快速| 国产视频一区在线观看| 亚洲一区制服丝袜美腿| 青青青青操在线观看免费| 中文字幕日本人妻中出| 亚洲国产香蕉视频在线播放| 久久精品美女免费视频| 亚洲高清自偷揄拍自拍| 黄色中文字幕在线播放| 亚洲 图片 欧美 图片| 成年人免费看在线视频| 亚洲国产欧美一区二区丝袜黑人 | 中文字幕网站你懂的| 国产成人一区二区三区电影网站| 婷婷五月亚洲综合在线| 久久免费看少妇高潮完整版| 日本免费午夜视频网站| 欧美日韩在线精品一区二区三| 国产精品入口麻豆啊啊啊| 日本性感美女三级视频| 美味人妻2在线播放| 亚洲成人熟妇一区二区三区| av破解版在线观看| 日本熟女50视频免费| 日韩欧美制服诱惑一区在线| 中文字幕网站你懂的| 欧美日韩一级黄片免费观看| 美女被肏内射视频网站| 一区二区三区蜜臀在线| 欧美va亚洲va天堂va| 激情图片日韩欧美人妻| 久久久91蜜桃精品ad| 欧洲黄页网免费观看| 久久精品美女免费视频| 在线不卡成人黄色精品| 国产污污污污网站在线| 搡老妇人老女人老熟女| 亚洲偷自拍高清视频| 久久久久国产成人精品亚洲午夜| 欧美黄色录像免费看的| 国产欧美日韩第三页| 婷婷综合亚洲爱久久| 天天操天天干天天插| 中文字幕一区二区三区人妻大片 | 亚洲 欧美 自拍 偷拍 在线| 日本xx片在线观看| 国产aⅴ一线在线观看| 91精品国产综合久久久蜜| 白白操白白色在线免费视频| chinese国产盗摄一区二区| 91极品新人『兔兔』精品新作| 亚洲嫩模一区二区三区| 亚洲熟妇久久无码精品| 国产乱子伦一二三区| 久草视频首页在线观看| 国产在线观看黄色视频| 亚洲第一伊人天堂网| 亚洲天堂第一页中文字幕| 91p0rny九色露脸熟女| 日本精品一区二区三区在线视频。| 天天日天天干天天干天天日| 日日夜夜大香蕉伊人| 中文字幕免费在线免费| 91精品国产综合久久久蜜| 黑人巨大精品欧美视频| 人人爱人人妻人人澡39| 国产一区av澳门在线观看| 2o22av在线视频| 亚洲嫩模一区二区三区| 青青青青草手机在线视频免费看| 日本脱亚入欧是指什么| 中文字幕最新久久久| 78色精品一区二区三区| 久久久久久久久久性潮| 久久国产精品精品美女| 91综合久久亚洲综合| 国产又色又刺激在线视频| 青青青视频自偷自拍38碰| aⅴ五十路av熟女中出| 国产剧情演绎系列丝袜高跟| 十八禁在线观看地址免费| 激情五月婷婷免费视频| 色伦色伦777国产精品| 91精品一区二区三区站长推荐| 91免费观看在线网站| 一本久久精品一区二区| 2020国产在线不卡视频| 这里有精品成人国产99| 亚洲av第国产精品| 欧美精品中文字幕久久二区| 92福利视频午夜1000看| 欧美日韩精品永久免费网址| 久久午夜夜伦痒痒想咳嗽P| 国产精品自偷自拍啪啪啪| 成人福利视频免费在线| 久久久久久久久久性潮| 欧美另类一区二区视频| 第一福利视频在线观看| 99久久99久国产黄毛片| 大香蕉伊人国产在线| 精品美女福利在线观看| 国产精品日韩欧美一区二区| av日韩在线免费播放| 视频在线亚洲一区二区| 少妇一区二区三区久久久| 久草视频福利在线首页| 欧美久久一区二区伊人| 18禁美女无遮挡免费| 亚洲伊人av天堂有码在线| 人人妻人人澡欧美91精品 | 国产午夜福利av导航| 欧美偷拍亚洲一区二区| 国产九色91在线观看精品| 天天干天天操天天扣| 国产 在线 免费 精品| 欧美精品黑人性xxxx| 精品亚洲中文字幕av| 大鸡巴插入美女黑黑的阴毛| 成人av中文字幕一区| 女人精品内射国产99| 久草视频首页在线观看| 人人人妻人人澡人人| 日本后入视频在线观看| 黑人性生活视频免费看| 国产露脸对白在线观看| 人妻少妇中文有码精品| 日韩欧美国产一区不卡| 国产剧情演绎系列丝袜高跟| 日韩一个色综合导航| 成人av在线资源网站| 精品91高清在线观看| 亚洲一区二区三区在线高清| 88成人免费av网站| 欧美黄片精彩在线免费观看 | 日本一二三中文字幕| 久久精品国产亚洲精品166m| 亚洲va国产va欧美精品88| 国产大鸡巴大鸡巴操小骚逼小骚逼| 丝袜长腿第一页在线| 影音先锋女人av噜噜色| 五月天久久激情视频| 99精品国产免费久久| 91国产资源在线视频| 激情国产小视频在线| 粉嫩欧美美人妻小视频| 精品国产高潮中文字幕| 欧美特色aaa大片| 黄色三级网站免费下载| 亚洲精品av在线观看| 亚洲天天干 夜夜操| 久久精品国产亚洲精品166m| 日本高清撒尿pissing| 中文字幕第1页av一天堂网| 成人免费公开视频无毒| 欧美色婷婷综合在线| 大香蕉大香蕉大香蕉大香蕉大香蕉| 大鸡吧插入女阴道黄色片| 岛国一区二区三区视频在线| 天天日天天日天天射天天干| 啊啊好大好爽啊啊操我啊啊视频| 国产亚洲视频在线观看| 免费无毒热热热热热热久| 国产亚洲视频在线观看| 九色porny九色9l自拍视频| 中文字幕在线第一页成人| 国产成人综合一区2区| 欧美另类z0z变态| 3337p日本欧洲大胆色噜噜| 午夜久久久久久久精品熟女| 女同性ⅹxx女同h偷拍| 天天插天天狠天天操| 操操网操操伊剧情片中文字幕网| 成人高清在线观看视频| 久久精品国产亚洲精品166m| 天天干天天插天天谢| 91亚洲国产成人精品性色| av在线资源中文字幕| 国产成人无码精品久久久电影| 成人久久精品一区二区三区| 91国产在线视频免费观看| 亚洲护士一区二区三区| 无套猛戳丰满少妇人妻| sejizz在线视频| 色婷婷精品大在线观看| 国产免费av一区二区凹凸四季| sejizz在线视频| 淫秽激情视频免费观看| 人妻丰满熟妇综合网| 国产麻豆91在线视频| 国产麻豆91在线视频| 成人av在线资源网站| 亚洲av色图18p| 亚洲天堂第一页中文字幕| 九色porny九色9l自拍视频| 唐人色亚洲av嫩草| 国产黑丝高跟鞋视频在线播放| av网址国产在线观看| 国产视频网站国产视频| AV无码一区二区三区不卡| 在线可以看的视频你懂的| 色av色婷婷人妻久久久精品高清 | 五十路老熟女码av| 93人妻人人揉人人澡人人| 美女视频福利免费看| 91免费黄片可看视频 | 四川五十路熟女av| 精品国产高潮中文字幕| 天干天天天色天天日天天射| 久久久久久性虐视频| 男女之间激情网午夜在线| 午夜的视频在线观看| av森泽佳奈在线观看| 激情人妻校园春色亚洲欧美| 午夜在线精品偷拍一区二| 激情人妻校园春色亚洲欧美| 这里只有精品双飞在线播放| brazzers欧熟精品系列| 夏目彩春在线中文字幕| 欧美综合婷婷欧美综合| 中文字幕免费在线免费| 欧美亚洲少妇福利视频| av中文字幕在线导航| 91 亚洲视频在线观看| 超级福利视频在线观看| 久久精品亚洲成在人线a| 日本一二三区不卡无| 国产污污污污网站在线| 国产午夜无码福利在线看| 亚洲自拍偷拍精品网| wwwxxx一级黄色片| 日韩av熟妇在线观看| 美日韩在线视频免费看| 一区二区三区四区视频在线播放| 男女啪啪视频免费在线观看| 激情内射在线免费观看| 精品欧美一区二区vr在线观看| 亚洲天堂第一页中文字幕| 国产九色91在线视频| 天天日天天敢天天干| 欧美视频一区免费在线| 五十路av熟女松本翔子| 绯色av蜜臀vs少妇| 早川濑里奈av黑人番号| 免费观看理论片完整版| 国产精品免费不卡av| 自拍偷拍vs一区二区三区| 黄色三级网站免费下载| 亚洲av自拍偷拍综合| 免费福利av在线一区二区三区| 国产麻豆国语对白露脸剧情| www,久久久,com| av视屏免费在线播放| 亚洲精品在线资源站| 大鸡吧插入女阴道黄色片| 精品一区二区三区三区88 | 最新日韩av传媒在线| 青青青青青青青青青青草青青| 98精产国品一二三产区区别| 成年人黄视频在线观看| 在线观看免费视频网| 夜夜骑夜夜操夜夜奸| 美女小视频网站在线| 亚洲第一伊人天堂网| 小泽玛利亚视频在线观看| 女蜜桃臀紧身瑜伽裤| 亚洲欧美日韩视频免费观看| 亚洲成人国产综合一区| 青娱乐最新视频在线| 被大鸡吧操的好舒服视频免费| 成年人午夜黄片视频资源| 999久久久久999| 熟女91pooyn熟女| 国产乱子伦精品视频潮优女| av一本二本在线观看| 操日韩美女视频在线免费看| 极品丝袜一区二区三区| 端庄人妻堕落挣扎沉沦| 最近中文2019年在线看| 国产视频网站国产视频| 亚洲综合一区二区精品久久| 欧美一级片免费在线成人观看 | 午夜极品美女福利视频| 深夜男人福利在线观看| 99热这里只有国产精品6| 亚洲高清一区二区三区视频在线| 2022国产精品视频| 不卡精品视频在线观看| 欧美精产国品一二三产品价格| 久草极品美女视频在线观看 | 中文字幕免费在线免费| 做爰视频毛片下载蜜桃视频1| 亚洲av琪琪男人的天堂| 99av国产精品欲麻豆| 成人sm视频在线观看| 天天操天天干天天艹| 99的爱精品免费视频| 看一级特黄a大片日本片黑人| 一色桃子久久精品亚洲| 青草亚洲视频在线观看| 色偷偷伊人大杳蕉综合网| 88成人免费av网站| 久久h视频在线观看| 激情啪啪啪啪一区二区三区| 黄色无码鸡吧操逼视频| 青青热久免费精品视频在线观看| 欧美视频不卡一区四区| 国产品国产三级国产普通话三级| 成人24小时免费视频| 亚洲精品乱码久久久本| 风流唐伯虎电视剧在线观看| 熟女人妻一区二区精品视频| 夜夜嗨av蜜臀av| 欧美成人综合视频一区二区| 亚洲最大黄了色网站| 黄色成年网站午夜在线观看| 色av色婷婷人妻久久久精品高清| 久久丁香婷婷六月天| 日本韩国亚洲综合日韩欧美国产 | 红桃av成人在线观看| www日韩毛片av| 国产精品污污污久久| 青青青青青青青青青青草青青 | 天天日天天爽天天爽| 国产精品中文av在线播放| a v欧美一区=区三区| 国产精品黄色的av| 午夜精品一区二区三区4| 国产成人自拍视频播放 | 天堂av在线播放免费| 在线可以看的视频你懂的 | 97精品综合久久在线| 粉嫩欧美美人妻小视频| 精品区一区二区三区四区人妻| 久久精品国产亚洲精品166m| 在线视频精品你懂的| 中文字幕一区二区三区人妻大片| av久久精品北条麻妃av观看| 99一区二区在线观看| 99re6热在线精品| 亚洲精品高清自拍av| 色综合天天综合网国产成人 | 日本高清撒尿pissing| 只有精品亚洲视频在线观看| 97欧洲一区二区精品免费| 免费看美女脱光衣服的视频| 全国亚洲男人的天堂| 亚洲国产美女一区二区三区软件| 精品国产在线手机在线| 日韩欧美国产一区不卡| 色偷偷伊人大杳蕉综合网| 久久久久久久久久性潮| 日韩av有码中文字幕| 亚洲另类在线免费观看| 又粗又硬又猛又爽又黄的| 毛片一级完整版免费| 欧美国品一二三产区区别| 国产亚洲精品品视频在线| 免费十精品十国产网站| 9l人妻人人爽人人爽| 日本人妻少妇18—xx| 51国产成人精品视频| 国产麻豆91在线视频| 久久这里有免费精品| 国产福利在线视频一区| 亚洲国产成人无码麻豆艾秋| 午夜精品一区二区三区4| 激情综合治理六月婷婷| 国产精品视频一区在线播放| 日本黄在免费看视频| 亚洲国产欧美国产综合在线| 经典av尤物一区二区| av手机在线观播放网站| 黄色成年网站午夜在线观看| 婷婷久久久久深爱网| 日本少妇在线视频大香蕉在线观看| 色综合久久五月色婷婷综合| 国产一区二区在线欧美| 日韩欧美制服诱惑一区在线| 中文字幕人妻一区二区视频| 久草免费人妻视频在线| 国产福利小视频二区| 日本熟妇一区二区x x| 亚洲高清免费在线观看视频| 在线不卡成人黄色精品| 久久久久久cao我的性感人妻 | 国产又粗又猛又爽又黄的视频在线| 亚洲精品国产综合久久久久久久久 | 大香蕉伊人中文字幕| 在线观看欧美黄片一区二区三区 | 91久久国产成人免费网站| 色呦呦视频在线观看视频| 在线国产精品一区二区三区| 天天射夜夜操综合网| 亚洲粉嫩av一区二区三区| 好男人视频在线免费观看网站| 国产黄色大片在线免费播放| 最近中文字幕国产在线| 国产又色又刺激在线视频| 亚洲日产av一区二区在线| 午夜av一区二区三区| 精品视频一区二区三区四区五区| 亚洲国产在人线放午夜| 日本xx片在线观看| 97少妇精品在线观看| 人妻在线精品录音叫床| 新97超碰在线观看| 天天做天天干天天舔| 国产福利小视频二区| 爱有来生高清在线中文字幕| av天堂中文字幕最新| 国产精品一区二区三区蜜臀av| 日本女大学生的黄色小视频| 亚洲一区二区三区久久午夜| 亚洲va欧美va人人爽3p| av手机免费在线观看高潮| av在线观看网址av| 男生舔女生逼逼视频| 亚洲综合一区二区精品久久| 日本黄色特一级视频| 亚洲精品在线资源站| 美女福利写真在线观看视频| 91天堂天天日天天操| 国产成人小视频在线观看无遮挡| 国产大学生援交正在播放| 91精品国产高清自在线看香蕉网 | 涩爱综合久久五月蜜臀| 欧美日韩激情啪啪啪| 美日韩在线视频免费看| 亚洲老熟妇日本老妇| 韩国AV无码不卡在线播放| 欧美日韩熟女一区二区三区| 日本av高清免费网站| av网址国产在线观看| 日本性感美女三级视频| 大陆av手机在线观看| 国产精品中文av在线播放| 日韩北条麻妃一区在线| 国产熟妇人妻ⅹxxxx麻豆| 欧美日韩v中文在线| 超pen在线观看视频公开97| 国产乱子伦一二三区| 欧美中文字幕一区最新网址| 女生被男生插的视频网站| 亚洲熟妇久久无码精品| 丝袜肉丝一区二区三区四区在线| 青草青永久在线视频18| 福利在线视频网址导航 | 护士小嫩嫩又紧又爽20p| 777奇米久久精品一区| 自拍偷拍日韩欧美一区二区| 乱亲女秽乱长久久久| 午夜在线观看一区视频| 午夜美女福利小视频| 亚洲1区2区3区精华液| 亚洲国产精品免费在线观看| yy6080国产在线视频| 可以免费看的www视频你懂的| 天天操天天干天天艹| 婷婷激情四射在线观看视频| 国产第一美女一区二区三区四区| 91人妻精品一区二区在线看| 爱爱免费在线观看视频| 午夜极品美女福利视频| 成人福利视频免费在线| 狠狠地躁夜夜躁日日躁| 国产麻豆精品人妻av| 日韩av熟妇在线观看| 免费观看理论片完整版| 欧美80老妇人性视频| 最新黄色av网站在线观看| 红桃av成人在线观看| 韩国三级aaaaa高清视频 | av在线观看网址av| 亚洲欧美自拍另类图片| 天天摸天天亲天天舔天天操天天爽| 久久久人妻一区二区| 天天日天天日天天擦| 91免费福利网91麻豆国产精品| 999久久久久999| 国产成人精品一区在线观看 | 日本韩国免费福利精品| av一本二本在线观看| 密臀av一区在线观看| 日本中文字幕一二区视频| 国产a级毛久久久久精品| 日韩欧美制服诱惑一区在线| 黑人巨大的吊bdsm| 98视频精品在线观看| 婷婷久久久久深爱网| 少妇一区二区三区久久久| 人妻丝袜av在线播放网址| 自拍 日韩 欧美激情| 精品一区二区三四区| 天天做天天干天天操天天射| 一区二区三区四区中文| 精品一线二线三线日本| av亚洲中文天堂字幕网| 在线观看免费岛国av| 亚洲精品国产久久久久久| 极品粉嫩小泬白浆20p主播| 午夜精品福利91av| 快插进小逼里大鸡吧视频| 国产又色又刺激在线视频| 亚洲一区二区三区久久受| 青青青青草手机在线视频免费看| 在线免费观看日本伦理| 亚洲精品国产综合久久久久久久久| 密臀av一区在线观看| 五十路av熟女松本翔子| 在线免费观看靠比视频的网站| weyvv5国产成人精品的视频| 18禁无翼鸟成人在线| 18禁网站一区二区三区四区| 人妻3p真实偷拍一二区| 懂色av之国产精品| 99热碰碰热精品a中文| 97资源人妻免费在线视频| 2020久久躁狠狠躁夜夜躁| 精品成人午夜免费看| chinese国产盗摄一区二区| 熟女人妻在线中出观看完整版 | 日韩人妻xxxxx| 经典亚洲伊人第一页| 老鸭窝在线观看一区| 热99re69精品8在线播放| 亚洲第17页国产精品| 18禁网站一区二区三区四区| 日本a级视频老女人| 99热久久极品热亚洲| 熟女人妻在线观看视频| 欧美视频中文一区二区三区| 成人30分钟免费视频| 国产成人小视频在线观看无遮挡| 91she九色精品国产| 做爰视频毛片下载蜜桃视频1| 男女啪啪啪啪啪的网站| jiujiure精品视频在线| 高清一区二区欧美系列| 亚洲国产成人在线一区| 老司机免费视频网站在线看| 91p0rny九色露脸熟女| 午夜免费体验区在线观看| 欧美一级色视频美日韩| 国产女人被做到高潮免费视频| 欧洲精品第一页欧洲精品亚洲| 国产视频一区二区午夜| 97年大学生大白天操逼| 亚洲精品欧美日韩在线播放 | av天堂资源最新版在线看| 美洲精品一二三产区区别| 亚洲 国产 成人 在线| 又粗又硬又猛又黄免费30| 自拍偷拍亚洲另类色图| 农村胖女人操逼视频| 91亚洲手机在线视频播放| 91精品国产高清自在线看香蕉网| 日韩人妻xxxxx| 亚洲第一黄色在线观看 | 精品国产高潮中文字幕| av在线观看网址av| 国产精品精品精品999| 久久精品久久精品亚洲人| 宅男噜噜噜666免费观看| 色噜噜噜噜18禁止观看| 熟女视频一区,二区,三区| 欧美精品一二三视频| 亚洲综合在线观看免费| 2018最新中文字幕在线观看| 国产视频一区在线观看| 2020中文字幕在线播放| 亚洲精品久久综合久| 青青青青操在线观看免费| 18禁美女黄网站色大片下载| 一二三中文乱码亚洲乱码one| 超碰97免费人妻麻豆| 日韩av有码中文字幕| 在线观看视频网站麻豆| 99精品国产自在现线观看| 97欧洲一区二区精品免费| 黄色录像鸡巴插进去| 亚洲一区二区三区久久午夜| 久久久久国产成人精品亚洲午夜| 日本高清在线不卡一区二区| 国产一区二区火爆视频| 黄色片一级美女黄色片| 婷婷色国产黑丝少妇勾搭AV| 中文字幕欧美日韩射射一| 中文字幕第一页国产在线| 一色桃子久久精品亚洲| 日本美女成人在线视频| 大香蕉大香蕉大香蕉大香蕉大香蕉| 少妇ww搡性bbb91| 亚洲欧美一区二区三区电影| 不卡精品视频在线观看| 亚洲av午夜免费观看| 青青青青视频在线播放| 福利国产视频在线观看| 风流唐伯虎电视剧在线观看| 狠狠操操操操操操操操操| 极品粉嫩小泬白浆20p主播| 亚洲av在线观看尤物| 精品久久久久久久久久久a√国产| 国产精品欧美日韩区二区| 天堂av狠狠操蜜桃| 亚洲精品在线资源站| 亚洲人一区二区中文字幕| 国产成人精品av网站| 日韩三级黄色片网站| 国产女人露脸高潮对白视频| 日韩欧美一级aa大片| 亚洲最大黄 嗯色 操 啊| 九色porny九色9l自拍视频| 日韩中文字幕精品淫| 日韩剧情片电影在线收看| 欧美精品 日韩国产| 国产欧美日韩在线观看不卡| 99精品视频之69精品视频| 99的爱精品免费视频| 中文字幕乱码人妻电影| 日韩美av高清在线| 美女被肏内射视频网站| 中文字幕乱码av资源| 青青草人人妻人人妻| 日韩不卡中文在线视频网站| 韩国黄色一级二级三级| nagger可以指黑人吗| av在线观看网址av| 亚洲综合在线视频可播放| 99久久99久国产黄毛片| 97国产福利小视频合集| av日韩在线免费播放| 91国产在线免费播放| 青春草视频在线免费播放| 78色精品一区二区三区| 超碰公开大香蕉97| 国产成人自拍视频播放| 国产精品人妻66p| 色综合久久五月色婷婷综合| 日本裸体熟妇区二区欧美| 亚洲一区av中文字幕在线观看| 欧美黑人性猛交xxxxⅹooo| 国产V亚洲V天堂无码欠欠| 欧美一区二区中文字幕电影 | 国产美女午夜福利久久| 欧美成人精品欧美一级黄色| 免费在线福利小视频| 老司机午夜精品视频资源| 在线国产精品一区二区三区| 日韩精品一区二区三区在线播放| 久久热这里这里只有精品| 精品亚洲中文字幕av| 好吊操视频这里只有精品| 久久久久久久精品成人热| 精品久久久久久久久久中文蒉 | 成人av在线资源网站| 成人亚洲精品国产精品| 男人和女人激情视频| 国产高潮无码喷水AV片在线观看| 护士小嫩嫩又紧又爽20p| 夜色17s精品人妻熟女| 午夜在线一区二区免费| 男人和女人激情视频| 国产精品视频欧美一区二区| 91精品免费久久久久久| 亚洲综合另类精品小说| 五十路丰满人妻熟妇| 亚洲国产欧美一区二区丝袜黑人| 三级黄色亚洲成人av| 超碰中文字幕免费观看| 亚洲免费福利一区二区三区| 久久久久久国产精品| 色av色婷婷人妻久久久精品高清| 日韩人妻丝袜中文字幕| 国产亚洲精品视频合集| 久久www免费人成一看片| 19一区二区三区在线播放| 中国黄色av一级片| 免费福利av在线一区二区三区| 水蜜桃一区二区三区在线观看视频| 东京热男人的av天堂| 中文 成人 在线 视频| 亚洲高清免费在线观看视频| 亚洲精品国品乱码久久久久| 中文字幕在线免费第一页| 污污小视频91在线观看| 日本成人不卡一区二区| 亚洲另类综合一区小说| 美女张开腿让男生操在线看| 亚洲精品 欧美日韩| av大全在线播放免费| 男人的天堂av日韩亚洲| 日本三极片中文字幕| 天堂资源网av中文字幕| 国产日韩精品免费在线| 熟女少妇激情五十路| aiss午夜免费视频| 最新91精品视频在线| 80电影天堂网官网| 91精品国产黑色丝袜| 国产使劲操在线播放| 成人激情文学网人妻| 都市家庭人妻激情自拍视频| 天天日天天敢天天干| av手机在线观播放网站| caoporm超碰国产| 天天爽夜夜爽人人爽QC| 天天射夜夜操综合网| 日日操夜夜撸天天干| 午夜毛片不卡免费观看视频| 国产精品久久综合久久| 超碰公开大香蕉97| 天天做天天爽夜夜做少妇| 中文字幕人妻熟女在线电影| 丝袜肉丝一区二区三区四区在线 | 国产大学生援交正在播放| 风流唐伯虎电视剧在线观看| 三级等保密码要求条款| 精品区一区二区三区四区人妻 | 亚洲一区二区人妻av| 国产va精品免费观看| weyvv5国产成人精品的视频| 38av一区二区三区| 国产激情av网站在线观看| 天堂av中文在线最新版| 欧美特色aaa大片| 亚洲公开视频在线观看| 福利视频一区二区三区筱慧| 亚洲综合一区成人在线| 久久热久久视频在线观看| 国产午夜亚洲精品不卡在线观看| 一区二区三区视频,福利一区二区 丰满的子国产在线观看 | 播放日本一区二区三区电影 | 亚洲熟女女同志女同| 91片黄在线观看喷潮| 欧美成人一二三在线网| 在线国产中文字幕视频| 青青热久免费精品视频在线观看 | 国产精品探花熟女在线观看| 国产 在线 免费 精品| 亚洲综合一区二区精品久久| 极品性荡少妇一区二区色欲| 免费在线黄色观看网站| 亚洲av天堂在线播放| 性欧美激情久久久久久久| 任你操视频免费在线观看| 中文字幕一区二区三区蜜月| 91亚洲国产成人精品性色| 天天干夜夜操天天舔| 国产精品探花熟女在线观看| 天天操夜夜操天天操天天操| 青青青视频手机在线观看| 国产亚洲欧美视频网站| 亚洲最大黄了色网站| 九色porny九色9l自拍视频| 欧美视频一区免费在线| 1024久久国产精品| 午夜精品福利一区二区三区p | 国产精品人妻熟女毛片av久| 东游记中文字幕版哪里可以看到| 精品视频中文字幕在线播放 | 在线网站你懂得老司机| 亚洲国际青青操综合网站| 福利视频一区二区三区筱慧| 日曰摸日日碰夜夜爽歪歪| 亚洲福利午夜久久久精品电影网 | 天堂av在线最新版在线| 人妻久久久精品69系列| 我想看操逼黄色大片| 午夜在线观看一区视频| 国内精品在线播放第一页| 日日爽天天干夜夜操| 少妇一区二区三区久久久| 五十路熟女人妻一区二| 国产精品大陆在线2019不卡| 国内自拍第一页在线观看| 亚洲一区久久免费视频| 日韩欧美国产一区ab| 亚洲欧美久久久久久久久| 3337p日本欧洲大胆色噜噜| 噜噜色噜噜噜久色超碰| 亚洲av黄色在线网站| 91九色porny蝌蚪国产成人| 成年美女黄网站18禁久久| 99精品国自产在线人| 粉嫩欧美美人妻小视频| 国产刺激激情美女网站| 2021年国产精品自拍| 亚洲天天干 夜夜操| 91免费观看在线网站| 亚洲欧美激情人妻偷拍| 亚洲午夜电影之麻豆| 天天日夜夜操天天摸| 大香蕉福利在线观看| 夜鲁夜鲁狠鲁天天在线| sw137 中文字幕 在线| 欧美精产国品一二三产品价格| 欧美成人综合色在线噜噜| 伊人成人在线综合网| 久久精品国产23696| 青青青艹视频在线观看| 91人妻精品一区二区在线看| 888欧美视频在线| av在线免费观看亚洲天堂| 久碰精品少妇中文字幕av| 中文字幕第一页国产在线| 亚洲欧美国产综合777| 国产va精品免费观看| 黑人解禁人妻叶爱071| 日本www中文字幕| 日韩熟女系列一区二区三区| 日本少妇人妻xxxxxhd| 99热久久这里只有精品| 日本欧美视频在线观看三区| 人妻丝袜精品中文字幕| 视频久久久久久久人妻| 久久久久久性虐视频| 岛国av高清在线成人在线| 中文字幕日韩无敌亚洲精品| 亚洲va国产va欧美va在线| 亚洲精品乱码久久久久久密桃明| 青青青视频手机在线观看| 2021久久免费视频| 国产精品日韩欧美一区二区| h国产小视频福利在线观看| 亚洲综合乱码一区二区| 秋霞午夜av福利经典影视| 宅男噜噜噜666国产| 中文字母永久播放1区2区3区| 好男人视频在线免费观看网站| 欧美香蕉人妻精品一区二区| 传媒在线播放国产精品一区| 欧美香蕉人妻精品一区二区| 韩国一级特黄大片做受| 年轻的人妻被夫上司侵犯| 国产成人精品av网站| 亚洲av一妻不如妾| 亚洲va欧美va人人爽3p| 经典av尤物一区二区| 在线观看成人国产电影| 黄色中文字幕在线播放| 97超碰国语国产97超碰| 免费无毒热热热热热热久| 初美沙希中文字幕在线| 99热久久极品热亚洲| 国产伊人免费在线播放| 我想看操逼黄色大片| 成人伊人精品色xxxx视频| 午夜福利人人妻人人澡人人爽| 成人国产激情自拍三区| 亚洲av极品精品在线观看| 天天干夜夜操啊啊啊| v888av在线观看视频| 青青在线视频性感少妇和隔壁黑丝 | 久碰精品少妇中文字幕av| 久草视频首页在线观看| 天天日天天玩天天摸| 涩爱综合久久五月蜜臀| 操人妻嗷嗷叫视频一区二区| 老鸭窝在线观看一区| 亚洲欧美成人综合在线观看| 国产一区自拍黄视频免费观看| 免费国产性生活视频| 男人和女人激情视频| 青草久久视频在线观看| 欧美日韩精品永久免费网址 | 欧美天堂av无线av欧美| 亚洲一区二区激情在线| 岛国黄色大片在线观看 | 天天综合天天综合天天网| 高清一区二区欧美系列| 青青草人人妻人人妻| 久久精品国产23696| 天堂av在线最新版在线| 欧美黑人与人妻精品| 91精品国产91久久自产久强| 91精品国产黑色丝袜| 人妻少妇亚洲精品中文字幕| 亚洲第17页国产精品| 亚洲中文字幕乱码区| 9l人妻人人爽人人爽| 国产一级精品综合av| 阴茎插到阴道里面的视频| 男女啪啪视频免费在线观看| 亚洲av自拍天堂网| 乱亲女秽乱长久久久| 欧亚日韩一区二区三区观看视频| 适合午夜一个人看的视频| 欧美精品一二三视频| 日本韩国在线观看一区二区| 国际av大片在线免费观看| 国产一区二区视频观看| 亚洲中文精品人人免费| 家庭女教师中文字幕在线播放| 美女av色播在线播放| 久久精品在线观看一区二区| 亚洲精品麻豆免费在线观看| 亚洲综合自拍视频一区| 欧美成人一二三在线网| 日韩中文字幕在线播放第二页| 国产又色又刺激在线视频| 中文字幕免费在线免费| 欧美日韩一区二区电影在线观看| 亚洲成人线上免费视频观看| 淫秽激情视频免费观看| 老司机午夜精品视频资源| 亚洲欧美久久久久久久久| 91在线免费观看成人| 日本一道二三区视频久久| 亚洲一级美女啪啪啪| 日韩美女福利视频网| 成人sm视频在线观看| 天堂av狠狠操蜜桃| 欧洲精品第一页欧洲精品亚洲| 亚洲国产欧美国产综合在线| 亚洲男人在线天堂网| xxx日本hd高清| 啊用力插好舒服视频| 80电影天堂网官网| 中文字日产幕乱六区蜜桃| 欧洲亚洲欧美日韩综合| 亚洲精品av在线观看| 国产午夜福利av导航| 国产真实灌醉下药美女av福利| 99热99这里精品6国产| 女生自摸在线观看一区二区三区 | lutube在线成人免费看| 久久久久久性虐视频| 国产自拍黄片在线观看| 免费岛国喷水视频在线观看 | 涩涩的视频在线观看视频| 日本少妇人妻xxxxxhd| 亚洲男人的天堂a在线| 熟女少妇激情五十路| 亚洲精品ww久久久久久| 98精产国品一二三产区区别| 午夜极品美女福利视频| 91麻豆精品久久久久| 久久久久久9999久久久久| 日本熟女精品一区二区三区| 五月婷婷在线观看视频免费| 成人免费毛片aaaa| 91超碰青青中文字幕| 欧美黄色录像免费看的| 国产视频精品资源网站| 只有精品亚洲视频在线观看| 亚洲另类伦春色综合小| 欧美麻豆av在线播放| 视频一区 视频二区 视频| 天堂资源网av中文字幕| wwwxxx一级黄色片| 国语对白xxxx乱大交| 538精品在线观看视频| 一区二区在线观看少妇| 亚洲免费av在线视频| 成人亚洲精品国产精品 | 老司机午夜精品视频资源| 91极品大一女神正在播放| 岛国免费大片在线观看| av日韩在线免费播放| 在线国产中文字幕视频| 在线观看的a站 最新| 欧美视频不卡一区四区| 中文字幕在线第一页成人| 日本高清在线不卡一区二区| av视屏免费在线播放| 欧美亚洲自偷自拍 在线| 春色激情网欧美成人| 青草亚洲视频在线观看| 天天干天天操天天摸天天射| 婷婷久久一区二区字幕网址你懂得| 日本高清成人一区二区三区| 久久久久久97三级| 一区二区三区毛片国产一区| 人妻少妇中文有码精品| 亚洲av黄色在线网站| 任你操任你干精品在线视频| 久久久久久9999久久久久| 亚洲少妇人妻无码精品| 福利视频广场一区二区| 黄色片一级美女黄色片| 日本成人一区二区不卡免费在线| 日本高清撒尿pissing| 久久久久国产成人精品亚洲午夜| rct470中文字幕在线| 337p日本大胆欧美人| 狠狠嗨日韩综合久久| 色综合天天综合网国产成人| 黄色片黄色片wyaa| 日本av高清免费网站| 久久精品久久精品亚洲人| 80电影天堂网官网| 91亚洲手机在线视频播放| 久草电影免费在线观看| 久久久精品精品视频视频| 国产在线拍揄自揄视频网站| 非洲黑人一级特黄片| 可以在线观看的av中文字幕| 老司机在线精品福利视频| 中文字幕在线观看极品视频| 中文字幕av男人天堂| 999久久久久999| 大陆av手机在线观看| 精品国产亚洲av一淫| 一区国内二区日韩三区欧美| 久久久精品国产亚洲AV一| av无限看熟女人妻另类av| 久久人人做人人妻人人玩精品vr| 91综合久久亚洲综合| 鸡巴操逼一级黄色气| 国产乱子伦一二三区| 久久久精品国产亚洲AV一| 欧美交性又色又爽又黄麻豆| 亚洲视频在线观看高清| 中国视频一区二区三区| 91免费福利网91麻豆国产精品| 天天干天天操天天插天天日| 18禁精品网站久久| 国产精品人妻66p| 精品老妇女久久9g国产| 首之国产AV医生和护士小芳| 2018在线福利视频| 新婚人妻聚会被中出| 日韩精品二区一区久久| 亚洲人妻视频在线网| 欧美成一区二区三区四区| 亚洲图片欧美校园春色| 久久人人做人人妻人人玩精品vr| 国产成人小视频在线观看无遮挡| av天堂加勒比在线| 精品国产午夜视频一区二区| 91精品国产麻豆国产| aaa久久久久久久久| 美女小视频网站在线| 国产又粗又硬又大视频| 和邻居少妇愉情中文字幕| 含骚鸡巴玩逼逼视频| 国产精品欧美日韩区二区| 91‖亚洲‖国产熟女| 色爱av一区二区三区| 国产欧美精品不卡在线| 成年美女黄网站18禁久久| 在线免费观看视频一二区| 在线国产中文字幕视频| 91小伙伴中女熟女高潮| 熟女国产一区亚洲中文字幕| 老司机福利精品免费视频一区二区 | 人妻少妇亚洲精品中文字幕| 亚洲美女美妇久久字幕组| 91在线视频在线精品3| 清纯美女在线观看国产| 国产麻豆91在线视频| 欧美专区第八页一区在线播放| 不卡精品视频在线观看| 初美沙希中文字幕在线| 中文字幕日韩无敌亚洲精品| 天天色天天操天天舔| 2020韩国午夜女主播在线| 一区二区三区毛片国产一区| av中文字幕在线观看第三页| 99国内小视频在现欢看| 骚货自慰被发现爆操| 社区自拍揄拍尻屁你懂的| 免费十精品十国产网站| 成年人午夜黄片视频资源| av老司机亚洲一区二区| 色秀欧美视频第一页| 黑人性生活视频免费看| 日本黄在免费看视频| 成人免费做爰高潮视频| 国产精品视频资源在线播放| 日本熟女50视频免费| 国产高清在线在线视频| 综合激情网激情五月天| 国产欧美精品不卡在线| 麻豆性色视频在线观看| 欧美成人综合视频一区二区| 国产午夜无码福利在线看| 91色秘乱一区二区三区| 蜜桃色婷婷久久久福利在线| 日日摸夜夜添夜夜添毛片性色av| 不卡日韩av在线观看| 青青草国内在线视频精选| 亚洲男人让女人爽的视频| 欧美日韩一区二区电影在线观看| 欧美黄色录像免费看的| 一区二区在线观看少妇| 91超碰青青中文字幕| 国产午夜亚洲精品麻豆| 国际av大片在线免费观看| 91精品一区二区三区站长推荐| 女同性ⅹxx女同h偷拍| 亚洲公开视频在线观看| 99精品免费久久久久久久久a| 77久久久久国产精产品| 日韩欧美国产精品91| 免费人成黄页网站在线观看国产| 第一福利视频在线观看| 欧美在线偷拍视频免费看| 喷水视频在线观看这里只有精品 | 国产自拍在线观看成人| lutube在线成人免费看| av无限看熟女人妻另类av| 成人性黑人一级av| 天天躁日日躁狠狠躁躁欧美av| 超污视频在线观看污污污| 国产普通话插插视频| 久久这里只有精彩视频免费| 亚洲特黄aaaa片| 日韩欧美国产一区不卡| 男人天堂最新地址av| 亚洲精品在线资源站| 国产精品入口麻豆啊啊啊 | 黄色视频在线观看高清无码| 又色又爽又黄的美女裸体| 中文字母永久播放1区2区3区| 在线免费观看国产精品黄色| 国产精品自拍在线视频| 日韩av有码中文字幕| 成人影片高清在线观看| 中文字幕熟女人妻久久久| www骚国产精品视频| jiujiure精品视频在线| 99热99这里精品6国产| 亚洲天堂精品久久久| 人妻少妇精品久久久久久| 中文字幕欧美日韩射射一| 岛国黄色大片在线观看| 人妻少妇中文有码精品| 欧美黑人性暴力猛交喷水| 欧美亚洲自偷自拍 在线| 在线免费观看99视频| 亚洲欧美人精品高清| 自拍偷拍亚洲精品第2页| 狠狠躁夜夜躁人人爽天天天天97| av中文字幕国产在线观看| 国产九色91在线观看精品| 欧亚日韩一区二区三区观看视频 | 馒头大胆亚洲一区二区| 亚洲成人国产综合一区| 男生舔女生逼逼的视频| 婷婷色国产黑丝少妇勾搭AV| 日韩午夜福利精品试看| 夜夜骑夜夜操夜夜奸| 成人亚洲国产综合精品| 1769国产精品视频免费观看| 涩爱综合久久五月蜜臀| 亚洲一级av大片免费观看| 97人妻人人澡爽人人精品| 大香蕉大香蕉在线看| 欧美日本在线视频一区| 亚洲欧美一区二区三区电影| 青青草成人福利电影| 色婷婷六月亚洲综合香蕉| 91久久人澡人人添人人爽乱| 国产精品入口麻豆啊啊啊| 色哟哟国产精品入口| 欧美一区二区三区久久久aaa| 国产97在线视频观看| 欧美日韩一区二区电影在线观看| 久久这里只有精彩视频免费| 午夜91一区二区三区| 美女被肏内射视频网站| 白白操白白色在线免费视频| 国产a级毛久久久久精品| 午夜激情精品福利视频| 激情图片日韩欧美人妻| 天天干夜夜操啊啊啊| 免费十精品十国产网站| 一区二区三区激情在线| 久久精品国产23696| 国产a级毛久久久久精品| tube69日本少妇| 黑人变态深video特大巨大| 欧美成人精品欧美一级黄色| 日韩精品中文字幕在线| 自拍偷拍亚洲欧美在线视频| 国产va精品免费观看| 亚洲午夜精品小视频| 国产美女一区在线观看| 黑人乱偷人妻中文字幕| 免费黄页网站4188| 狍和女人的王色毛片| 蜜臀av久久久久久久| 热99re69精品8在线播放| 视频啪啪啪免费观看| 久久精品视频一区二区三区四区| 久久精品亚洲成在人线a| 天天日天天干天天要| 成人精品视频99第一页| 91免费观看国产免费| 少妇深喉口爆吞精韩国| 特一级特级黄色网片| 青娱乐极品视频青青草| 亚洲一区久久免费视频| 91大神福利视频网| 啪啪啪操人视频在线播放| 国产美女午夜福利久久| 免费看美女脱光衣服的视频| 日韩av熟妇在线观看| 中英文字幕av一区| 亚洲综合一区成人在线| 亚洲国产香蕉视频在线播放| 亚洲高清自偷揄拍自拍| 免费在线播放a级片| 性感美女高潮视频久久久| 国产成人精品久久二区91| 亚洲第一伊人天堂网| 视频久久久久久久人妻| 97小视频人妻一区二区| 亚洲免费成人a v| 9久在线视频只有精品| 97少妇精品在线观看| 韩国一级特黄大片做受| 欧美一区二区三区乱码在线播放 | 亚洲精品亚洲人成在线导航 | 欧美另类重口味极品在线观看| 超碰97人人做人人爱| 美女张开两腿让男人桶av| 日韩欧美国产一区ab| 中文字幕亚洲久久久| 亚洲av色图18p| 伊人综合免费在线视频| 青春草视频在线免费播放| 午夜精品福利91av| 无码中文字幕波多野不卡| 视频在线亚洲一区二区| av中文字幕福利网| 亚洲国产精品久久久久蜜桃| 女生自摸在线观看一区二区三区 | 亚洲推理片免费看网站| 天天日天天天天天天天天天天| 男人在床上插女人视频| 熟女国产一区亚洲中文字幕| 亚洲免费成人a v| 中文字幕第一页国产在线| 精品一区二区亚洲欧美| 国产精品一区二区三区蜜臀av | 97超碰最新免费在线观看| 11久久久久久久久久久| 黑人大几巴狂插日本少妇| 一色桃子久久精品亚洲| 五十路丰满人妻熟妇| 51国产偷自视频在线播放| 岛国免费大片在线观看| 啊啊好慢点插舔我逼啊啊啊视频| 色噜噜噜噜18禁止观看| 国产自拍黄片在线观看| 中文字幕日本人妻中出| 人妻丝袜精品中文字幕| 天天日天天敢天天干| 99热久久这里只有精品8| 国产麻豆精品人妻av| 精产国品久久一二三产区区别| 婷婷久久久综合中文字幕| 午夜毛片不卡免费观看视频| av中文字幕网址在线| 亚洲av琪琪男人的天堂| 二区中出在线观看老师| 亚洲丝袜老师诱惑在线观看| 免费男阳茎伸入女阳道视频| 蜜臀成人av在线播放| 人妻丰满熟妇综合网| 91传媒一区二区三区| 中文字幕最新久久久| 国产精品成久久久久三级蜜臀av | 亚洲色偷偷综合亚洲AV伊人| 亚洲中文字幕国产日韩| 午夜青青草原网在线观看| 日本高清成人一区二区三区| 午夜精品一区二区三区更新| 美女av色播在线播放| 美女av色播在线播放| 色噜噜噜噜18禁止观看| 亚洲成人av在线一区二区| 欧美激情精品在线观看| 国产在线一区二区三区麻酥酥| 免费无码人妻日韩精品一区二区| 狠狠躁夜夜躁人人爽天天天天97| 一区二区三区国产精选在线播放| 中文字幕日韩人妻在线三区| 瑟瑟视频在线观看免费视频| 一二三区在线观看视频| 精品久久久久久久久久久久人妻| 黑人解禁人妻叶爱071| 欧美专区第八页一区在线播放| 中文字幕一区二区三区人妻大片 | 国产精品一区二区久久久av| 欧美中文字幕一区最新网址| 99的爱精品免费视频| 99久久99一区二区三区| 午夜dv内射一区区| 在线观看国产免费麻豆| 日日夜夜精品一二三| 国产伦精品一区二区三区竹菊| 国产性感美女福利视频| 高潮喷水在线视频观看| 国产成人午夜精品福利| 亚洲欧美成人综合在线观看| 精品日产卡一卡二卡国色天香| 色婷婷六月亚洲综合香蕉| 99精品国产自在现线观看| 人妻另类专区欧美制服| 欧美日韩亚洲国产无线码| 黑人巨大精品欧美视频| 亚洲一区二区久久久人妻| 丝袜长腿第一页在线| 中文字幕日韩人妻在线三区| 国产大学生援交正在播放| 成人动漫大肉棒插进去视频| 亚洲成人av一区久久| 偷拍自拍视频图片免费| 国产伊人免费在线播放| 亚洲免费国产在线日韩| av手机在线观播放网站| 一区二区在线视频中文字幕| 92福利视频午夜1000看| 免费一级特黄特色大片在线观看| 美女福利写真在线观看视频| 精品久久久久久久久久久a√国产| 婷婷午夜国产精品久久久| 久久久制服丝袜中文字幕| 国产日韩一区二区在线看| 第一福利视频在线观看| 2021天天色天天干| 神马午夜在线观看视频| 中文字幕网站你懂的| 青青热久免费精品视频在线观看| 视频啪啪啪免费观看| 国产亚洲精品视频合集| 国产亚洲欧美45p| 五月色婷婷综合开心网4438| 日韩a级黄色小视频| 小泽玛利亚视频在线观看| 年轻的人妻被夫上司侵犯| 久久免看30视频口爆视频| 人妻无码中文字幕专区| 熟女人妻在线观看视频| 国产一线二线三线的区别在哪| 亚洲成人熟妇一区二区三区| 国产精品久久久久网| 日本韩国在线观看一区二区| 视频二区在线视频观看| 黄色视频成年人免费观看| 久久久久只精品国产三级| 亚洲伊人色一综合网| 成人精品在线观看视频| 日本少妇人妻xxxxx18| 91麻豆精品秘密入口在线观看 | yy96视频在线观看| 91人妻精品一区二区久久| 国产麻豆剧传媒精品国产av蜜桃| 老司机99精品视频在线观看 | 国产高清精品一区二区三区| 538精品在线观看视频| 999九九久久久精品| 天天操天天干天天日狠狠插 | 国产精彩对白一区二区三区| 亚洲偷自拍高清视频| 六月婷婷激情一区二区三区| 国产成人精品av网站| rct470中文字幕在线| 东京干手机福利视频| 午夜福利资源综合激情午夜福利资| 新婚人妻聚会被中出| 欧美黄片精彩在线免费观看| 在线亚洲天堂色播av电影| 操日韩美女视频在线免费看 | 国产成人精品一区在线观看 | 不卡日韩av在线观看| 深田咏美亚洲一区二区| 青青青青青手机视频| 大肉大捧一进一出好爽在线视频| 精品亚洲在线免费观看| 91国内精品久久久久精品一| 亚洲精品中文字幕下载| 亚洲男人让女人爽的视频| 91免费观看在线网站| 91在线视频在线精品3| 亚洲男人让女人爽的视频| 99久久激情婷婷综合五月天| 天天日天天添天天爽| 在线免费观看欧美小视频| 成人区人妻精品一区二视频| 综合激情网激情五月五月婷婷| av欧美网站在线观看| 操人妻嗷嗷叫视频一区二区 | 狠狠鲁狠狠操天天晚上干干| 大鸡八强奸视频在线观看| 91国偷自产一区二区三区精品| 欧美专区日韩专区国产专区| 又大又湿又爽又紧A视频| 亚洲国产精品久久久久久6| 成人久久精品一区二区三区| 欧美精品中文字幕久久二区| 夜夜躁狠狠躁日日躁麻豆内射 | 大香蕉日本伊人中文在线| 老司机免费福利视频网| 午夜激情高清在线观看| 任你操任你干精品在线视频| 精品久久久久久久久久久99| 宅男噜噜噜666国产| 亚洲欧美清纯唯美另类| 91综合久久亚洲综合| av无限看熟女人妻另类av| 国产在线观看黄色视频| 青青草原色片网站在线观看| 亚洲Av无码国产综合色区| 国产精品精品精品999| 操人妻嗷嗷叫视频一区二区 | 5528327男人天堂| 亚洲 自拍 色综合图| 久久久久久cao我的性感人妻| 久久久精品精品视频视频| 粉嫩av蜜乳av蜜臀| 中文字幕免费福利视频6| 亚洲精品乱码久久久久久密桃明| 一区二区三区综合视频| 久久久久久性虐视频| 国产中文精品在线观看| 精品美女在线观看视频在线观看 | 亚洲成a人片777777| 蜜桃视频17c在线一区二区| 少妇人妻真实精品视频| 男人和女人激情视频| 国产aⅴ一线在线观看| 91麻豆精品秘密入口在线观看| 18禁美女黄网站色大片下载| 动漫美女的小穴视频| 青青青青爽手机在线| 美女操逼免费短视频下载链接| 亚洲成人激情视频免费观看了| 国产精品一区二区三区蜜臀av | 久久久久久久久久久久久97| av在线播放国产不卡| 国产黄色片蝌蚪九色91| 亚洲综合乱码一区二区| 婷婷综合蜜桃av在线| 少妇露脸深喉口爆吞精| 91传媒一区二区三区| 又色又爽又黄的美女裸体| 成人动漫大肉棒插进去视频| 久久一区二区三区人妻欧美| 插逼视频双插洞国产操逼插洞| 日本中文字幕一二区视频| 亚洲综合色在线免费观看| 欧美一级视频一区二区| 久久久久久久99精品| 91p0rny九色露脸熟女| 精品成人啪啪18免费蜜臀| 天天日天天添天天爽| 日日操综合成人av| 亚洲一区二区三区久久午夜| 黄色大片免费观看网站| 亚洲成人黄色一区二区三区| 日本成人不卡一区二区| 亚洲欧美一卡二卡三卡| 福利在线视频网址导航| 99热这里只有精品中文| 51国产成人精品视频| 亚洲av日韩高清hd| 欧美亚洲偷拍自拍色图| 91一区精品在线观看| 成人区人妻精品一区二视频| 国产精品系列在线观看一区二区| 国产日韩欧美美利坚蜜臀懂色| 亚洲码av无色中文| 啪啪啪18禁一区二区三区 | 日本午夜福利免费视频| 狠狠躁狠狠爱网站视频| 1000部国产精品成人观看视频| sejizz在线视频| 不戴胸罩引我诱的隔壁的人妻| 超黄超污网站在线观看| 国产亚洲欧美45p| 欧美一区二区三区久久久aaa| 大陆精品一区二区三区久久| 孕妇奶水仑乱A级毛片免费看| 日韩欧美制服诱惑一区在线| 日本乱人一区二区三区| 色秀欧美视频第一页| 熟女人妻在线观看视频| 91 亚洲视频在线观看| 啪啪啪操人视频在线播放| 啪啪啪啪啪啪啪免费视频| 2022国产综合在线干| 综合色区亚洲熟妇shxstz| 亚洲精品国品乱码久久久久| 国产视频在线视频播放| 又粗又硬又猛又黄免费30| 一区国内二区日韩三区欧美| 自拍偷拍亚洲欧美在线视频| gay gay男男瑟瑟在线网站| 国产成人一区二区三区电影网站| 含骚鸡巴玩逼逼视频| 国产美女午夜福利久久| 91国内精品久久久久精品一| 少妇一区二区三区久久久| 偷拍自拍国产在线视频| 无码精品一区二区三区人| 国产精品人久久久久久| 在线免费视频 自拍| 国产九色91在线观看精品| 自拍偷拍日韩欧美一区二区| 看一级特黄a大片日本片黑人| 午夜精品一区二区三区更新| 亚洲成人激情视频免费观看了| 天天干天天操天天爽天天摸| 中国黄片视频一区91| 国产真实灌醉下药美女av福利| 天天干天天爱天天色| 天堂v男人视频在线观看| 国产janese在线播放| 99久久超碰人妻国产| 亚洲人成精品久久久久久久| 91chinese在线视频| 亚洲精品国产久久久久久| 97少妇精品在线观看| 亚洲精品午夜久久久久| 91国产在线免费播放| 国产一区av澳门在线观看| 骚逼被大屌狂草视频免费看| 亚洲熟妇x久久av久久| 亚洲欧美福利在线观看| 欧美视频一区免费在线| 美女大bxxxx内射| av手机免费在线观看高潮| 亚洲特黄aaaa片| 青青草在观免费国产精品| 91九色porny国产蝌蚪视频| 亚洲黄色av网站免费播放| 国产成人综合一区2区| 国产视频精品资源网站| 2020中文字幕在线播放| 久久久精品精品视频视频| 欧美女同性恋免费a| nagger可以指黑人吗| 日本美女成人在线视频| 亚洲国产在线精品国偷产拍| 国产av欧美精品高潮网站| yy6080国产在线视频| 欧美黑人巨大性xxxxx猛交| 黑人大几巴狂插日本少妇| 宅男噜噜噜666免费观看| 日韩熟女系列一区二区三区| 在线 中文字幕 一区| 亚洲欧美另类自拍偷拍色图| 五月天色婷婷在线观看视频免费| 人妻少妇亚洲一区二区| 少妇深喉口爆吞精韩国| 成熟丰满熟妇高潮xx×xx| 国产欧美日韩在线观看不卡| 久久久久久九九99精品| 亚洲激情,偷拍视频| 天天干天天操天天爽天天摸| 天美传媒mv视频在线观看| 成人高清在线观看视频| 自拍偷拍一区二区三区图片| 97超碰国语国产97超碰| 99re久久这里都是精品视频| 75国产综合在线视频| 日韩亚洲高清在线观看| 国产日韩欧美视频在线导航| 中文字幕一区二区三区人妻大片 | 伊人网中文字幕在线视频| 大屁股肉感人妻中文字幕在线| 亚洲中文字字幕乱码| 和邻居少妇愉情中文字幕| 青青青激情在线观看视频| 色哟哟国产精品入口| 激情图片日韩欧美人妻| 无码国产精品一区二区高潮久久4| 欧美偷拍亚洲一区二区| 区一区二区三国产中文字幕| 日韩北条麻妃一区在线| 中国熟女@视频91| 黄色视频在线观看高清无码| av完全免费在线观看av| 午夜成午夜成年片在线观看 | 亚国产成人精品久久久| 国产中文精品在线观看| 亚洲av可乐操首页| 天码人妻一区二区三区在线看| 久久久久五月天丁香社区| 国产精品亚洲а∨天堂免| 人妻激情图片视频小说| 欧美80老妇人性视频| 亚洲天堂精品久久久| 国产精品久久久久久久久福交| 亚洲欧美清纯唯美另类| 2022国产综合在线干| 亚洲欧美国产综合777| 阴茎插到阴道里面的视频| 自拍偷拍日韩欧美亚洲| 99热这里只有国产精品6| 日韩一区二区三区三州| 久久这里只有精彩视频免费| 日本人妻欲求不满中文字幕| 亚洲成人激情视频免费观看了| 91人妻精品一区二区在线看| 熟女人妻一区二区精品视频| 在线成人日韩av电影| 91极品新人『兔兔』精品新作| 午夜青青草原网在线观看| 9色精品视频在线观看| 日韩欧美高清免费在线| 成年人该看的视频黄免费| 成人24小时免费视频| 小泽玛利亚视频在线观看| 骚逼被大屌狂草视频免费看| 亚洲精品国偷自产在线观看蜜桃| 美女 午夜 在线视频| 性欧美日本大妈母与子| 国产老熟女伦老熟妇ⅹ| 国产精品伦理片一区二区| 精品久久久久久久久久中文蒉| 国产一区二区三免费视频| 黄色无码鸡吧操逼视频| 久草视频福利在线首页| 亚洲2021av天堂| 国产精品国产三级国产精东 | 国产精品福利小视频a| 操人妻嗷嗷叫视频一区二区| 日本欧美视频在线观看三区| 午夜激情高清在线观看| 天天日天天日天天擦| 黄工厂精品视频在线观看 | 91精品国产观看免费| 2018最新中文字幕在线观看| 天堂av中文在线最新版| 久久精品视频一区二区三区四区| 久久香蕉国产免费天天| 午夜精品一区二区三区福利视频| 亚洲一区二区久久久人妻| 黄色男人的天堂视频| 天天操天天插天天色| 毛茸茸的大外阴中国视频| 天天摸天天亲天天舔天天操天天爽| 亚洲色偷偷综合亚洲AV伊人| 亚洲高清视频在线不卡| 一色桃子久久精品亚洲| 粉嫩av蜜乳av蜜臀| 日韩少妇人妻精品无码专区| av中文字幕电影在线看| 色av色婷婷人妻久久久精品高清| 亚洲国产成人最新资源| 大胸性感美女羞爽操逼毛片| 我想看操逼黄色大片| 91极品新人『兔兔』精品新作| 男人在床上插女人视频| 秋霞午夜av福利经典影视| 美女视频福利免费看| 亚洲成人国产av在线| 日本av在线一区二区三区| 一区二区三区国产精选在线播放| 激情图片日韩欧美人妻| 小泽玛利亚视频在线观看| 成人av亚洲一区二区| 久久艹在线观看视频| 91av精品视频在线| 亚洲嫩模一区二区三区| 中文字日产幕乱六区蜜桃| 精品人妻伦一二三区久 | 91国内视频在线观看| 亚洲视频在线视频看视频在线| 亚洲熟女女同志女同| 色综合天天综合网国产成人| 免费费一级特黄真人片 | 做爰视频毛片下载蜜桃视频1| 人妻最新视频在线免费观看| 国产精品国产三级国产精东| 一级A一级a爰片免费免会员| 亚洲成人国产av在线| 91片黄在线观看喷潮| 色天天天天射天天舔| 免费在线观看视频啪啪| 日本韩国免费一区二区三区视频| 伊人综合免费在线视频| 日本最新一二三区不卡在线 | 欧美日本在线视频一区| 欧美日韩一区二区电影在线观看 | 天天日天天日天天射天天干| 欧美在线一二三视频| 午夜精品一区二区三区城中村| 亚洲精品久久综合久| 亚洲av成人网在线观看| 自拍偷拍一区二区三区图片 | 91极品新人『兔兔』精品新作| 大屁股熟女一区二区三区| 97精品综合久久在线| 91精品国产麻豆国产| 欧洲黄页网免费观看| 亚洲的电影一区二区三区| 婷婷综合亚洲爱久久| 日韩影片一区二区三区不卡免费 | 亚洲国产欧美国产综合在线| 亚洲另类图片蜜臀av| 亚洲国产欧美国产综合在线| 亚洲一区二区三区在线高清| 成人国产影院在线观看| 中国熟女一区二区性xx| 一级黄片大鸡巴插入美女 | 亚洲美女高潮喷浆视频| 免费高清自慰一区二区三区网站| 黑人巨大精品欧美视频| 激情啪啪啪啪一区二区三区| 精产国品久久一二三产区区别| 国产麻豆剧果冻传媒app| 午夜激情精品福利视频| 日辽宁老肥女在线观看视频| 国产剧情演绎系列丝袜高跟| 国产妇女自拍区在线观看| 深田咏美亚洲一区二区| 97精品人妻一区二区三区精品| 在线免费观看日本伦理| 在线免费观看亚洲精品电影| 国产精品人妻一区二区三区网站| 美女福利视频网址导航| 国产大学生援交正在播放| 性感美女诱惑福利视频| 亚洲激情,偷拍视频| 在线免费观看av日韩| 果冻传媒av一区二区三区| AV无码一区二区三区不卡| 一区二区三区在线视频福利| 乱亲女秽乱长久久久| 不卡日韩av在线观看| 四虎永久在线精品免费区二区| 一区二区三区美女毛片| 色av色婷婷人妻久久久精品高清 | 在线免费观看日本片| www日韩毛片av| 亚洲av琪琪男人的天堂| 精品亚洲中文字幕av| 国产精品自拍偷拍a| 日韩近亲视频在线观看| 在线新三级黄伊人网| 在线免费91激情四射| av久久精品北条麻妃av观看| 激情伦理欧美日韩中文字幕| 性色av一区二区三区久久久| 99精品一区二区三区的区| 日韩美女福利视频网| 欧美精品一二三视频| 日韩欧美制服诱惑一区在线| 亚洲av无乱一区二区三区性色| 人妻无码中文字幕专区| 免费手机黄页网址大全| 久久久久久cao我的性感人妻| av在线免费观看亚洲天堂| 在线观看国产网站资源| 亚洲一区二区三区在线高清| 日韩美女综合中文字幕pp| 久久丁香花五月天色婷婷| 午夜激情久久不卡一区二区 | 老司机免费视频网站在线看| 欧美激情电影免费在线| 日韩精品一区二区三区在线播放| 可以免费看的www视频你懂的| 大陆av手机在线观看| 黑人借宿ntr人妻的沦陷2| 日本一区精品视频在线观看| 日本熟妇色熟妇在线观看| 在线观看免费岛国av| 97人妻夜夜爽二区欧美极品| 天天操夜夜骑日日摸| 国产熟妇人妻ⅹxxxx麻豆| 一区二区久久成人网| 在线免费观看欧美小视频| 国产日本精品久久久久久久| 午夜精品一区二区三区4| 国产丰满熟女成人视频| 青青操免费日综合视频观看| 国产精品人妻熟女毛片av久| 97精品视频在线观看| 久久艹在线观看视频| 偷拍自拍国产在线视频| 国产亚洲视频在线观看| 伊人综合aⅴ在线网| 日韩美女综合中文字幕pp| 中文字幕日本人妻中出| 亚洲综合另类精品小说| 亚洲日本一区二区久久久精品| 欧美一级片免费在线成人观看| 欧美一区二区三区久久久aaa| 日韩美女福利视频网| 午夜91一区二区三区| 久久久久只精品国产三级| 亚洲av琪琪男人的天堂| 91免费观看在线网站| 男人操女人的逼免费视频| 午夜婷婷在线观看视频| 欧美一区二区三区乱码在线播放| 亚洲公开视频在线观看| 天天爽夜夜爽人人爽QC| 人妻素人精油按摩中出| 91大神福利视频网| 欧美va不卡视频在线观看| 亚洲 欧美 精品 激情 偷拍| 播放日本一区二区三区电影| 免费岛国喷水视频在线观看| 国产成人精品一区在线观看| okirakuhuhu在线观看| 欧美专区第八页一区在线播放| 天码人妻一区二区三区在线看| 亚洲视频在线观看高清| 亚洲欧洲一区二区在线观看| ka0ri在线视频| 美女吃鸡巴操逼高潮视频| 成年人午夜黄片视频资源| 日本人竟这样玩学生妹| 亚洲欧美激情人妻偷拍| 亚洲熟女综合色一区二区三区四区 | 国产精品中文av在线播放| 中文字幕,亚洲人妻| 亚洲精品久久综合久| 好吊操视频这里只有精品| yellow在线播放av啊啊啊| xxx日本hd高清| 亚洲精品精品国产综合| 欧美视频一区免费在线| av天堂资源最新版在线看| 青青草原色片网站在线观看| 色综合久久五月色婷婷综合| 亚洲视频乱码在线观看| 久精品人妻一区二区三区| 亚洲午夜伦理视频在线| av在线shipin| 精品黑人巨大在线一区| 狠狠的往里顶撞h百合| 国产亚洲成人免费在线观看| 日韩欧美一级黄片亚洲| 狠狠躁狠狠爱网站视频| 一区二区视频视频视频| 亚洲国产成人最新资源| 黄色成年网站午夜在线观看 | 中文字幕日韩精品就在这里| 欧美熟妇一区二区三区仙踪林| 最近中文字幕国产在线| 中英文字幕av一区| 91精品资源免费观看| 馒头大胆亚洲一区二区| 天天干天天操天天玩天天射 | 成人在线欧美日韩国产| 这里只有精品双飞在线播放| 麻豆性色视频在线观看| 精品成人啪啪18免费蜜臀| 热99re69精品8在线播放| 班长撕开乳罩揉我胸好爽| 国产视频网站一区二区三区| 特黄老太婆aa毛毛片| 2018在线福利视频| 99精品免费观看视频| 国产精品黄色的av| 亚洲午夜电影在线观看| 手机看片福利盒子日韩在线播放 | 黄色资源视频网站日韩| 精品国产亚洲av一淫| 亚洲一级美女啪啪啪| 性感美女高潮视频久久久| 日本熟妇一区二区x x| 日韩美女福利视频网| 日本中文字幕一二区视频| 激情小视频国产在线| 9国产精品久久久久老师|