久久精品国产精品国产精品污,男人扒开添女人下部免费视频,一级国产69式性姿势免费视频,夜鲁夜鲁很鲁在线视频 视频,欧美丰满少妇一区二区三区,国产偷国产偷亚洲高清人乐享,中文 在线 日韩 亚洲 欧美,熟妇人妻无乱码中文字幕真矢织江,一区二区三区人妻制服国产

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

Java正则表达式:我最期望弄懂的知识,希望对大家都有帮助

發布時間:2024/2/28 java 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java正则表达式:我最期望弄懂的知识,希望对大家都有帮助 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  import java.util.regex.*;

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

  BufferedReader in;

  Pattern pattern = Pattern.compile("//(//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來實現正則表達式的人來說,這段代碼很平常。在Python和Javascript這些語言中,或者其他的語言,這些正則表達式一旦明確地編譯過后,你想用到哪里都可以。與Perl的單步匹配相比,看起來多多做了些工作,但這并不很費事。

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

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

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

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

  Pattern pattern =

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

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

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

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

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

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

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

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

  Pattern.CASE_INSENSITIVE);

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

?

CharSequence

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

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

為了實現這個新的CharSequence接口,StringStringBuffer以及CharBuffer都作了修改。很多正則表達式的操作都要拿CharSequence作參數。

PatternMatcher

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

//: c12:TestRegularExpression.java // Allows you to easly try out regular expressions. // {Args: abcabcabcdefabc "abc+" "(abc)+" "(abc){2,}" } import java.util.regex.*; publicclass TestRegularExpression { publicstaticvoid main(String[] args) { if(args.length < 2) {System.out.println("Usage:/n" + "java TestRegularExpression " + "characterSequence regularExpression+");System.exit(0);}System.out.println("Input: /"" + args[0] + "/""); for(int i = 1; i < args.length; i++) {System.out.println( "Regular expression: /"" + args[i] + "/"");Pattern p = Pattern.compile(args[i]);Matcher m = p.matcher(args[0]); while(m.find()) {System.out.println("Match /"" + m.group() + "/" at positions " +m.start() + "-" + (m.end() - 1));}}} } ///:~

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

staticboolean matches(?regex, ?input)

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

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

boolean matches() boolean lookingAt() boolean find() boolean find(int start)

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

find( )

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

//: c12:FindDemo.java import java.util.regex.*; import com.bruceeckel.simpletest.*; import java.util.*; publicclass FindDemo { privatestatic Test monitor = new Test(); publicstaticvoid main(String[] args) {Matcher m = Pattern.compile("//w+").matcher("Evening is full of the linnet's wings"); while(m.find())System.out.println(m.group()); int i = 0; while(m.find(i)) {System.out.print(m.group() + " ");i++;}monitor.expect(new String[] { "Evening", "is", "full", "of", "the", "linnet", "s", "wings", "Evening vening ening ning ing ng g is is s full " + "full ull ll l of of f the the he e linnet linnet " + "innet nnet net et t s s wings wings ings ngs gs s "});} } ///:~

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

Groups

Group是指里用括號括起來的,能被后面的表達式調用的正則表達式。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的數目。不包括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的結束位置,最后一個字符的下標加一。

//: c12:Groups.java import java.util.regex.*; import com.bruceeckel.simpletest.*; publicclass Groups { privatestatic Test monitor = new Test(); staticpublicfinal String poem = "Twas brillig, and the slithy toves/n" + "Did gyre and gimble in the wabe./n" + "All mimsy were the borogoves,/n" + "And the mome raths outgrabe./n/n" + "Beware the Jabberwock, my son,/n" + "The jaws that bite, the claws that catch./n" + "Beware the Jubjub bird, and shun/n" + "The frumious Bandersnatch."; publicstaticvoid main(String[] args) {Matcher m =Pattern.compile("(?m)(//S+)//s+((//S+)//s+(//S+))___FCKpd___6quot;).matcher(poem); while(m.find()) { for(int j = 0; j <= m.groupCount(); j++)System.out.print("[" + m.group(j) + "]");System.out.println();}monitor.expect(new String[]{ "[the slithy toves]" + "[the][slithy toves][slithy][toves]", "[in the wabe.][in][the wabe.][the][wabe.]", "[were the borogoves,]" + "[were][the borogoves,][the][borogoves,]", "[mome raths outgrabe.]" + "[mome][raths outgrabe.][raths][outgrabe.]", "[Jabberwock, my son,]" + "[Jabberwock,][my son,][my][son,]", "[claws that catch.]" + "[claws][that catch.][that][catch.]", "[bird, and shun][bird,][and shun][and][shun]", "[The frumious Bandersnatch.][The]" + "[frumious Bandersnatch.][frumious][Bandersnatch.]"});} } ///:~

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

start( )和end( )

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

//: c12:StartEnd.java import java.util.regex.*; import com.bruceeckel.simpletest.*; publicclass StartEnd { privatestatic Test monitor = new Test(); publicstaticvoid main(String[] args) {String[] input = new String[] { "Java has regular expressions in 1.4", "regular expressions now expressing in Java", "Java represses oracular expressions"};Patternp1 = Pattern.compile("re//w*"),p2 = Pattern.compile("Java.*"); for(int i = 0; i < input.length; i++) {System.out.println("input " + i + ": " + input[i]);Matcherm1 = p1.matcher(input[i]),m2 = p2.matcher(input[i]); while(m1.find())System.out.println("m1.find() '" + m1.group() + "' start = "+ m1.start() + " end = " + m1.end()); while(m2.find())System.out.println("m2.find() '" + m2.group() + "' start = "+ m2.start() + " end = " + m2.end()); if(m1.lookingAt()) // No reset() necessarySystem.out.println("m1.lookingAt() start = "+ m1.start() + " end = " + m1.end()); if(m2.lookingAt())System.out.println("m2.lookingAt() start = "+ m2.start() + " end = " + m2.end()); if(m1.matches()) // No reset() necessarySystem.out.println("m1.matches() start = "+ m1.start() + " end = " + m1.end()); if(m2.matches())System.out.println("m2.matches() start = "+ m2.start() + " end = " + m2.end());}monitor.expect(new String[] { "input 0: Java has regular expressions in 1.4", "m1.find() 'regular' start = 9 end = 16", "m1.find() 'ressions' start = 20 end = 28", "m2.find() 'Java has regular expressions in 1.4'" + " start = 0 end = 35", "m2.lookingAt() start = 0 end = 35", "m2.matches() start = 0 end = 35", "input 1: regular expressions now " + "expressing in Java", "m1.find() 'regular' start = 0 end = 7", "m1.find() 'ressions' start = 11 end = 19", "m1.find() 'ressing' start = 27 end = 34", "m2.find() 'Java' start = 38 end = 42", "m1.lookingAt() start = 0 end = 7", "input 2: Java represses oracular expressions", "m1.find() 'represses' start = 5 end = 14", "m1.find() 'ressions' start = 27 end = 35", "m2.find() 'Java represses oracular expressions' " + "start = 0 end = 35", "m2.lookingAt() start = 0 end = 35", "m2.matches() start = 0 end = 35"});} } ///:~

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

匹配的模式(Pattern flags)

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

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

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

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

//: c12:ReFlags.java import java.util.regex.*; import com.bruceeckel.simpletest.*; publicclass ReFlags { privatestatic Test monitor = new Test(); publicstaticvoid main(String[] args) {Pattern p = Pattern.compile("^java",Pattern.CASE_INSENSITIVE | Pattern.MULTILINE);Matcher m = p.matcher( "java has regex/nJava has regex/n" + "JAVA has pretty good regular expressions/n" + "Regular expressions are in Java"); while(m.find())System.out.println(m.group());monitor.expect(new String[] { "java", "Java", "JAVA"});} } ///:~

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

split( )

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

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

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

//: c12:SplitDemo.java import java.util.regex.*; import com.bruceeckel.simpletest.*; import java.util.*; publicclass SplitDemo { privatestatic Test monitor = new Test(); publicstaticvoid main(String[] args) {String input = "This!!unusual use!!of exclamation!!points";System.out.println(Arrays.asList(Pattern.compile("!!").split(input))); // Only do the first three:System.out.println(Arrays.asList(Pattern.compile("!!").split(input, 3)));System.out.println(Arrays.asList( "Aha! String has a split() built in!".split(" ")));monitor.expect(new String[] { "[This, unusual use, of exclamation, points]", "[This, unusual use, of exclamation!!points]", "[Aha!, String, has, a, split(), built, in!]"});} } ///:~

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

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

替換操作

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

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

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

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

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

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

//: c12:TheReplacements.java import java.util.regex.*; import java.io.*; import com.bruceeckel.util.*; import com.bruceeckel.simpletest.*; /*! Here's a block of text to use as input tothe regular expression matcher. Note that we'llfirst extract the block of text by looking forthe special delimiters, then process theextracted block. !*/ publicclass TheReplacements { privatestatic Test monitor = new Test(); publicstaticvoid main(String[] args) throws Exception {String s = TextFile.read("TheReplacements.java"); // Match the specially-commented block of text above:Matcher mInput =Pattern.compile("///*!(.*)!//*/", Pattern.DOTALL).matcher(s); if(mInput.find())s = mInput.group(1); // Captured by parentheses // Replace two or more spaces with a single space:s = s.replaceAll(" {2,}", " "); // Replace one or more spaces at the beginning of each // line with no spaces. Must enable MULTILINE mode:s = s.replaceAll("(?m)^ +", "");System.out.println(s);s = s.replaceFirst("[aeiou]", "(VOWEL1)");StringBuffer sbuf = new StringBuffer();Pattern p = Pattern.compile("[aeiou]");Matcher m = p.matcher(s); // Process the find information as you // perform the replacements: while(m.find())m.appendReplacement(sbuf, m.group().toUpperCase()); // Put in the remainder of the text:m.appendTail(sbuf);System.out.println(sbuf);monitor.expect(new String[]{ "Here's a block of text to use as input to", "the regular expression matcher. Note that we'll", "first extract the block of text by looking for", "the special delimiters, then process the", "extracted block. ", "H(VOWEL1)rE's A blOck Of tExt tO UsE As InpUt tO", "thE rEgUlAr ExprEssIOn mAtchEr. NOtE thAt wE'll", "fIrst ExtrAct thE blOck Of tExt by lOOkIng fOr", "thE spEcIAl dElImItErs, thEn prOcEss thE", "ExtrActEd blOck. "});} } ///:~

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

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

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

reset( )

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

//: c12:Resetting.java import java.util.regex.*; import java.io.*; import com.bruceeckel.simpletest.*; publicclass Resetting { privatestatic Test monitor = new Test(); publicstaticvoid main(String[] args) throws Exception {Matcher m = Pattern.compile("[frb][aiu][gx]").matcher("fix the rug with bags"); while(m.find())System.out.println(m.group());m.reset("fix the rig with rags"); while(m.find())System.out.println(m.group());monitor.expect(new String[]{ "fix", "rug", "bag", "fix", "rig", "rag"});} } ///:~

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

?

如果你曾經用過Perl或任何其他內建正則表達式支持的語言,你一定知道用正則表達式處理文本和匹配模式是多么簡單。如果你不熟悉這個術語,那么“正則表達式”(Regular Expression)就是一個字符構成的串,它定義了一個用來搜索匹配字符串的模式。
許多語言,包括Perl、PHP、PythonJavaScriptJScript,都支持用正則表達式處理文本,一些文本編輯器用正則表達式實現高級“搜索-替換”功能。那么Java又怎樣呢?本文寫作時,一個包含了用正則表達式進行文本處理的Java規范需求(Specification Request)已經得到認可,你可以期待在JDK的下一版本中看到它。
然而,如果現在就需要使用正則表達式,又該怎么辦呢?你可以從Apache.org下載源代碼開放的Jakarta-ORO庫。本文接下來的內容先簡要地介紹正則表達式的入門知識,然后以Jakarta-ORO API為例介紹如何使用正則表達式。
一、正則表達式基礎知識
我們先從簡單的開始。假設你要搜索一個包含字符“cat”的字符串,搜索用的正則表達式就是“cat”。如果搜索對大小寫不敏感,單詞“catalog”、“Catherine”、“sophisticated”都可以匹配。也就是說:
1.1 句點符號
假設你在玩英文拼字游戲,想要找出三個字母的單詞,而且這些單詞必須以“t”字母開頭,以“n”字母結束。另外,假設有一本英文字典,你可以用正則表達式搜索它的全部內容。要構造出這個正則表達式,你可以使用一個通配符——句點符號“.”。這樣,完整的表達式就是“t.n”,它匹配“tan”、“ten”、“tin”和“ton”,還匹配“t#n”、“tpn”甚至“t n”,還有其他許多無意義的組合。這是因為句點符號匹配所有字符,包括空格、Tab字符甚至換行符:
1.2 方括號符號
為了解決句點符號匹配范圍過于廣泛這一問題,你可以在方括號(“[]”)里面指定看來有意義的字符。此時,只有方括號里面指定的字符才參與匹配。也就是說,正則表達式“t[aeio]n”只匹配“tan”、“Ten”、“tin”和“ton”。但“Toon”不匹配,因為在方括號之內你只能匹配單個字符:
1.3 “或”符號
如果除了上面匹配的所有單詞之外,你還想要匹配“toon”,那么,你可以使用“|”操作符。“|”操作符的基本意義就是“或”運算。要匹配“toon”,使用“t(a|e|i|o|oo)n”正則表達式。這里不能使用方擴號,因為方括號只允許匹配單個字符;這里必須使用圓括號“()”。圓括號還可以用來分組,具體請參見后面介紹。
1.4 表示匹配次數的符號
表一顯示了表示匹配次數的符號,這些符號用來確定緊靠該符號左邊的符號出現的次數:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

二、Jakarta-ORO庫
有許多源代碼開放的正則表達式庫可供Java程序員使用,而且它們中的許多支持Perl 5兼容的正則表達式語法。我在這里選用的是Jakarta-ORO正則表達式庫,它是最全面的正則表達式API之一,而且它與Perl 5正則表達式完全兼容。另外,它也是優化得最好的API之一。
Jakarta-ORO庫以前叫做OROMatcher,Daniel Savarese大方地把它贈送給了Jakarta Project。你可以按照本文最后參考資源的說明下載它。
我首先將簡要介紹使用Jakarta-ORO庫時你必須創建和訪問的對象,然后介紹如何使用Jakarta-ORO API。
▲ PatternCompiler對象
首先,創建一個Perl5Compiler類的實例,并把它賦值給PatternCompiler接口對象。Perl5Compiler是PatternCompiler接口的一個實現,允許你把正則表達式編譯成用來匹配的Pattern對象。
▲ Pattern對象
要把正則表達式編譯成Pattern對象,調用compiler對象的compile()方法,并在調用參數中指定正則表達式。例如,你可以按照下面這種方式編譯正則表達式“t[aeio]n”:
默認情況下,編譯器創建一個大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配“tin”、“tan”、 “ten”和“ton”,但不匹配“Tin”和“taN”。要創建一個大小寫不敏感的模式,你應該在調用編譯器的時候指定一個額外的參數:
創建好Pattern對象之后,你就可以通過PatternMatcher類用該Pattern對象進行模式匹配。
▲ PatternMatcher對象
PatternMatcher對象根據Pattern對象和字符串進行匹配檢查。你要實例化一個Perl5Matcher類并把結果賦值給PatternMatcher接口。Perl5Matcher類是PatternMatcher接口的一個實現,它根據Perl 5正則表達式語法進行模式匹配:
使用PatternMatcher對象,你可以用多個方法進行匹配操作,這些方法的第一個參數都是需要根據正則表達式進行匹配的字符串:
· boolean matches(String input, Pattern pattern):當輸入字符串和正則表達式要精確匹配時使用。換句話說,正則表達式必須完整地描述輸入字符串。
· boolean matchesPrefix(String input, Pattern pattern):當正則表達式匹配輸入字符串起始部分時使用。
· boolean contains(String input, Pattern pattern):當正則表達式要匹配輸入字符串的一部分時使用(即,它必須是一個子串)。
另外,在上面三個方法調用中,你還可以用PatternMatcherInput對象作為參數替代String對象;這時,你可以從字符串中最后一次匹配的位置開始繼續進行匹配。當字符串可能有多個子串匹配給定的正則表達式時,用PatternMatcherInput對象作為參數就很有用了。用PatternMatcherInput對象作為參數替代String時,上述三個方法的語法如下:
· boolean matches(PatternMatcherInput input, Pattern pattern)
· boolean matchesPrefix(PatternMatcherInput input, Pattern pattern)
· boolean contains(PatternMatcherInput input, Pattern pattern)
三、應用實例
下面我們來看看Jakarta-ORO庫的一些應用實例。
3.1 日志文件處理
任務:分析一個Web服務器日志文件,確定每一個用戶花在網站上的時間。在典型的BEA WebLogic日志文件中,日志記錄的格式如下:
分析這個日志記錄,可以發現,要從這個日志文件提取的內容有兩項:IP地址和頁面訪問時間。你可以用分組符號(圓括號)從日志記錄提取出IP地址和時間標記。
首先我們來看看IP地址。IP地址有4個字節構成,每一個字節的值在0到255之間,各個字節通過一個句點分隔。因此,IP地址中的每一個字節有至少一個、最多三個數字。圖八顯示了為IP地址編寫的正則表達式:

圖八:匹配IP地址

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

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

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

圖十:匹配IP地址和時間標記

現在正則表達式已經編寫完畢,接下來可以編寫使用正則表達式庫的Java代碼了。
為使用Jakarta-ORO庫,首先創建正則表達式字符串和待分析的日志記錄字符串:
這里使用的正則表達式與圖十的正則表達式差不多完全相同,但有一點例外:在Java中,你必須對每一個向前的斜杠(“/”)進行轉義處理。圖十不是Java的表示形式,所以我們要在每個“/”前面加上一個“/”以免出現編譯錯誤。遺憾的是,轉義處理過程很容易出現錯誤,所以應該小心謹慎。你可以首先輸入未經轉義處理的正則表達式,然后從左到右依次把每一個“/”替換成“//”。如果要復檢,你可以試著把它輸出到屏幕上。
初始化字符串之后,實例化PatternCompiler對象,用PatternCompiler編譯正則表達式創建一個Pattern對象:
現在,創建PatternMatcher對象,調用PatternMatcher接口的contain()方法檢查匹配情況:
接下來,利用PatternMatcher接口返回的MatchResult對象,輸出匹配的組。由于logEntry字符串包含匹配的內容,你可以看到類如下面的輸出:
3.2 HTML處理實例一
下面一個任務是分析HTML頁面內FONT標記的所有屬性。HTML頁面內典型的FONT標記如下所示:
程序將按照如下形式,輸出每一個FONT標記的屬性:
在這種情況下,我建議你使用兩個正則表達式。第一個如圖十一所示,它從字體標記提取出“"face="Arial, Serif" size="+2" color="red"”。

圖十一:匹配FONT標記的所有屬性

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

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

分割結果為:
現在我們來看看完成這個任務的Java代碼。首先創建兩個正則表達式字符串,用Perl5Compiler把它們編譯成Pattern對象。編譯正則表達式的時候,指定Perl5Compiler.CASE_INSENSITIVE_MASK選項,使得匹配操作不區分大小寫。
接下來,創建一個執行匹配操作的Perl5Matcher對象。
假設有一個String類型的變量html,它代表了HTML文件中的一行內容。如果html字符串包含FONT標記,匹配器將返回true。此時,你可以用匹配器對象返回的MatchResult對象獲得第一個組,它包含了FONT的所有屬性:
接下來創建一個PatternMatcherInput對象。這個對象允許你從最后一次匹配的位置開始繼續進行匹配操作,因此,它很適合于提取FONT標記內屬性的名字-值對。創建PatternMatcherInput對象,以參數形式傳入待匹配的字符串。然后,用匹配器實例提取出每一個FONT的屬性。這通過指定PatternMatcherInput對象(而不是字符串對象)為參數,反復地調用PatternMatcher對象的contains()方法完成。PatternMatcherInput對象之中的每一次迭代將把它內部的指針向前移動,下一次檢測將從前一次匹配位置的后面開始。
本例的輸出結果如下:
3.3 HTML處理實例二
下面我們來看看另一個處理HTML的例子。這一次,我們假定Web服務器從widgets.acme.com移到了newserver.acme.com。現在你要修改一些頁面中的鏈接:
執行這個搜索的正則表達式如圖十三所示:

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

如果能夠匹配這個正則表達式,你可以用下面的內容替換圖十三的鏈接:
注意#字符的后面加上了$1。Perl正則表達式語法用$1、$2等表示已經匹配且提取出來的組。圖十三的表達式把所有作為一個組匹配和提取出來的內容附加到鏈接的后面。
現在,返回Java。就象前面我們所做的那樣,你必須創建測試字符串,創建把正則表達式編譯到Pattern對象所必需的對象,以及創建一個PatternMatcher對象:
接下來,用com.oroinc.text.regex包Util類的substitute()靜態方法進行替換,輸出結果字符串:
Util.substitute()方法的語法如下:
這個調用的前兩個參數是以前創建的PatternMatcher和Pattern對象。第三個參數是一個Substiution對象,它決定了替換操作如何進行。本例使用的是Perl5Substitution對象,它能夠進行Perl5風格的替換。第四個參數是想要進行替換操作的字符串,最后一個參數允許指定是否替換模式的所有匹配子串(Util.SUBSTITUTE_ALL),或只替換指定的次數。
【結束語】在這篇文章中,我為你介紹了正則表達式的強大功能。只要正確運用,正則表達式能夠在字符串提取和文本修改中起到很大的作用。另外,我還介紹了如何在Java程序中通過Jakarta-ORO庫利用正則表達式。至于最終采用老式的字符串處理方式(使用StringTokenizer,charAt,和substring),還是采用正則表達式,這就有待你自己決定了。

Jakarta-ORO篇

陳廣佳?(cgjmail@163.net)
電子信息工程系工科學士
2001 年 12 月

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

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

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

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

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

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

Jakarta-ORO正則表達式庫

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

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

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

PatternCompiler compiler=new Perl5Compiler();

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

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


在默認的情況下,編譯器會創建一個對大小寫敏感的模式(pattern)。因此,上面代碼編譯得到的模式只匹配"say"、"shy"、 "sky"和"sly",但不匹配"Say"和"skY"。要創建一個大小寫不敏感的模式,你應該在調用編譯器的時候指定一個額外的參數:
pattern=compiler.compile("s[ahkl]y",Perl5Compiler.CASE_INSENSITIVE_MASK);

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

★PatternMatcher對象:

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

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

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


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

    用PatternMatcherInput對象作為參數替代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)




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

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

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

    StringSubstitution:
    StringSubstitution 實現的是簡單的純文字替換手段,它有兩個構造方法:

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

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

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

    它有三個構造器:

    Perl5Substitution()

    Perl5Substitution(java.lang.String substitution)

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

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

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

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

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

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

    舉個例子會更好理解:

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

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

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

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

    表名:AESOP, 表中每條記錄包含有三列:
    ID(int):單詞索引號
    WORD(varchar):單詞
    CONTENT(varchar):存放單詞的相關解釋與例句等內容

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

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

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

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

  • 確定相應的正則表達式:/[[^]]+/]

    這個是很簡單的正則表達式,其意思是要求相匹配的字符串必須為以一對中括號包含的所有內容,如['kevin] 、[名詞]等,但內容中不包括"]"符號,也就是要避免出現"[][]"會作為一個匹配對象的情況出現(有關正則表達式的基礎知識請參照有關資料,這里不再詳述)。

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

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

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

  • 實例化PatternCompiler對象,創建Pattern對象

    PatternCompiler compiler=new Perl5Compiler();

    Pattern pattern=compiler.compile(restring);

  • 創建PatternMatcher對象,調用PatternMatcher接口的contain()方法檢查匹配情況:
    PatternMatcher matcher=new Perl5Matcher();if (matcher.contains(content,pattern)) {//處理代碼片段}


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

    具體實現的完整的程序代碼如下:

    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庫而創建相應的對象 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+"的音標為:"+pure);}}}catch(Exception e) {System.out.println(e);}} }


    輸出結果為:kevin的音標為['kevin]



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

    用程序驗證,輸出結果同樣為:kevin的音標為['kevin]

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

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

    result.group(1) ->返回[音標]項內容,結果應是['kevin]

    result.group(2) ->返回[詞性]項內容,結果應是[名詞]

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

    ★查找多個匹配:
    經過第一步的嘗試使用Jakarta-ORO后,我們已經知道了如何正確使用該API包來查找目標字符串里一個匹配的子串,下面我們接著來看一看當目標字符串里包含不止一個匹配的子串時我們如何把它們一個接一個找出來進行相應的處理。

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

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

    PatternMatcherInput input=new PatternMatcherInput(content);while (matcher.contains(input,pattern)) {result=matcher.getMatch();System.out.println(result.group(0)) }
    輸出結果為:['kevin]
    [名詞]

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

    第一步當然是要定出相應的正則表達式,需要有兩個,一是和整個例句部分(也就是由大括號包起來的部分)匹配的正則表達式:"/{.+/}",

    另一個則要和每個例句部分匹配(也就是小括號中的內容),:/(([^)]+/)



    而且由于要把例句的各項分離出來,所以要再把里面的各部分用分組的方法匹配出來:" ([^(]+)/(.+)/(.+):([^)]+) "。

    為了簡便起見,我們不再和從數據庫里讀出,而是構造一個包含同樣內容的字符串變量,程序片段如下:

    try{String content="['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞:凱文) (Kevin is living in ZhuHai now./凱文現住在珠海/名詞: 凱文)}";String ps1="//{.+//}";String ps2="//([^)]+//)";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);}


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

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

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

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

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

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

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

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

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

    try{String content="['kevin] [名詞](人名凱文){(Kevin loves comic./凱文愛漫畫/名詞: 凱文)(Kevin lives in ZhuHai now./凱文現住在珠海/名詞: 凱文)}";String ps1="//{(//([^)]+//))(//([^)]+//))//}";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./ 凱文已經看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。)}",1),content,Util.SUBSTITUTE_ALL);System.out.println(result);}catch(Exception e) {System.out.println(e);}


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

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

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

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

    參考資料:

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



    關于作者?
    陳廣佳 Kevin Chen,汕頭大學電子信息工程系工科學士,臺灣大新出版社珠海區開發部,現正圍繞中日韓電子資料使用JAVA開發電子詞典等相關項目。可通過E-mail:cgjmail@163.net于他聯系。

    java.util.regex篇

    陳廣佳?(cgjmail@163.net)
    電子信息工程系工科學士
    2001 年 12 月

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

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

    它包括兩個類:PatternMatcher

    Pattern一個Pattern是一個正則表達式經編譯后的表現模式。
    Matcher一個Matcher對象是一個狀態機器,它依據Pattern對象做為匹配模式對字符串展開匹配檢查。


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

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

    2.Pattern類:
    Pattern的方法如下:

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

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

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

    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." +"/ 凱文已經看過《這個殺手不太冷》幾次了,因為它是一部" +"好電影。/名詞:凱文。");for (int i=0; i<result.length; i++)System.out.println(result[i]);} }


    輸出結果為:

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

    很明顯,該程序將字符串按"/"進行了分段,我們以下再使用?split(CharSequence input, int limit)方法來指定分段的段數,程序改動為:
    tring[] result = p.split("Kevin has seen《LEON》seveal times,because it is a good film./ 凱文已經看過《這個殺手不太冷》幾次了,因為它是一部好電影。/名詞:凱文。",2);

    這里面的參數"2"表明將目標語句分為兩段。

    輸出結果則為:

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

    由上面的例子,我們可以比較出java.util.regex包在構造Pattern對象以及編譯指定的正則表達式的實現手法與我們在上一篇中所介紹的Jakarta-ORO 包在完成同樣工作時的差別,Jakarta-ORO 包要先構造一個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的構造法比Jakarta-ORO更為簡潔并容易理解。

    3.Matcher類:
    Matcher方法如下:

    MatcherappendReplacement(StringBuffer sb, String replacement)
    將當前匹配子串替換為指定字符串,并且將替換后的子串以及其之前到上次匹配子串之后的字符串段添加到一個StringBuffer對象里。
    StringBufferappendTail(StringBuffer sb)
    將最后一次匹配工作后剩余的字符串添加到一個StringBuffer對象里。
    intend()
    返回當前匹配的子串的最后一個字符在原目標字符串中的索引位置 。
    intend(int group)
    返回與匹配模式里指定的組相匹配的子串最后一個字符的位置。
    booleanfind()
    嘗試在目標字符串里查找下一個匹配子串。
    booleanfind(int start)
    重設Matcher對象,并且嘗試在目標字符串里從指定的位置開始查找下一個匹配的子串。
    Stringgroup()
    返回當前查找而獲得的與組匹配的所有子串內容
    Stringgroup(int group)
    返回當前查找而獲得的與指定的組匹配的子串內容
    intgroupCount()
    返回當前查找所獲得的匹配組的數量。
    booleanlookingAt()
    檢測目標字符串是否以匹配的子串起始。
    booleanmatches()
    嘗試對整個目標字符展開匹配檢測,也就是只有整個目標字符串完全匹配時才返回真值。
    Patternpattern()
    返回該Matcher對象的現有匹配模式,也就是對應的Pattern 對象。
    StringreplaceAll(String replacement)
    將目標字符串里與既有模式相匹配的子串全部替換為指定的字符串。
    StringreplaceFirst(String replacement)
    將目標字符串里第一個與既有模式相匹配的子串替換為指定的字符串。
    Matcherreset()
    重設該Matcher對象。
    Matcherreset(CharSequence input)
    重設該Matcher對象并且指定一個新的目標字符串。
    intstart()
    返回當前查找所獲子串的開始字符在原目標字符串中的位置。
    intstart(int group)
    返回當前查找所獲得的和指定組匹配的子串的第一個字符在原目標字符串中的位置。

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

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

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

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

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


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

    ★replaceAll ()/appendReplacement()/appendTail():
    Matcher類同時提供了四個將匹配子串替換成指定字符串的方法:

  • replaceAll()
  • replaceFirst()
  • appendReplacement()
  • appendTail()


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

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

    例如,有字符串fatcatfatcatfat,假設既有正則表達式模式為"cat",第一次匹配后調用appendReplacement(sb,"dog"),那么這時StringBuffer sb的內容為fatdog,也就是fatcat中的cat被替換為dog并且與匹配子串前的內容加到sb里,而第二次匹配后調用appendReplacement(sb,"dog"),那么sb的內容就變為fatdogfatdog,如果最后再調用一次appendTail(sb),那么sb最終的內容將是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();//使用循環將句子里所有的kelvin找出并替換再將內容加到sb里while(result) {i++;m.appendReplacement(sb, "Kevin");System.out.println("第"+i+"次匹配后sb的內容是:"+sb);//繼續查找下一個匹配對象result = m.find();}//最后調用appendTail()方法將最后一次匹配后的剩余字符串加到sb里;m.appendTail(sb);System.out.println("調用m.appendTail(sb)后sb的最終內容是:"+ sb.toString());} }


    最終輸出結果為:
    第1次匹配后sb的內容是:Kevin
    第2次匹配后sb的內容是:Kevin Li and Kevin
    第3次匹配后sb的內容是:Kevin Li and Kevin Chan are both working in Kevin
    第4次匹配后sb的內容是:Kevin Li and Kevin Chan are both working in Kevin Chen's Kevin
    調用m.appendTail(sb)后sb的最終內容是: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()方法類似(有關Jakarta-ORO請參考上篇的內容),都是要返回與組匹配的子串內容,下面代碼將很好解釋其用法:

    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("該次查找獲得匹配組的數量為:"+m.groupCount());for(int i=1;i<=m.groupCount();i++){System.out.println("第"+i+"組的子串內容為: "+m.group(i));}} }


    輸出為:
    該次查找獲得匹配組的數量為:2
    第1組的子串內容為:ca
    第2組的子串內容為:t

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

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

    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) {//如果找到了非法字符那么就設下標記deletedIllegalChars = true;//如果里面包含非法字符如冒號雙引號等,那么就把他們消去,加到SB里面m.appendReplacement(sb, "");result = m.find();}m.appendTail(sb);input = sb.toString();if (deletedIllegalChars) {System.out.println("輸入的EMAIL地址里包含有冒號、逗號等非法字符,請修改");System.out.println("您現在的輸入為: "+args[0]);System.out.println("修改后合法的地址應類似: "+input);}} }


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

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

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

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

    當輸入為:cgjmail#$%@163.net

    那么輸出就是:

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

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

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

    參考資料

    • java.util.regex的幫助文檔
    • Dana Nourie 和Mike McCloskey所寫的Regular Expressions and the Java" Programming Language
    • 需要更多的第三方正則表達式資源以及基于它們所開發的應用程序請看http://www.meurrens.org/ip-Links/java/regex/index.html


    關于作者?
    陳廣佳 Kevin Chen,汕頭大學電子信息工程系工科學士,臺灣大新出版社珠海區開發部,現正圍繞中日韓電子資料使用JAVA開發電子詞典等相關項目。可通過E-mail:cgjmail@163.net于他聯系。

    總結

    以上是生活随笔為你收集整理的Java正则表达式:我最期望弄懂的知识,希望对大家都有帮助的全部內容,希望文章能夠幫你解決所遇到的問題。

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

    亚洲中文字幕无码一久久区 | 中文字幕+乱码+中文字幕一区 | 女人和拘做爰正片视频 | 久热国产vs视频在线观看 | 天下第一社区视频www日本 | 亚洲中文无码av永久不收费 | 成人精品视频一区二区 | 无码乱肉视频免费大全合集 | 伊人色综合久久天天小片 | 国产av一区二区三区最新精品 | 国产精品亚洲五月天高清 | av小次郎收藏 | 99精品久久毛片a片 | 国产午夜亚洲精品不卡 | 国产成人精品必看 | 爱做久久久久久 | 免费人成在线观看网站 | 99精品国产综合久久久久五月天 | 久久精品国产大片免费观看 | 久久综合给久久狠狠97色 | 国产成人精品一区二区在线小狼 | 巨爆乳无码视频在线观看 | 少妇人妻大乳在线视频 | 西西人体www44rt大胆高清 | 午夜精品久久久久久久久 | 好男人www社区 | 免费看少妇作爱视频 | 亚洲精品一区二区三区四区五区 | 88国产精品欧美一区二区三区 | 国产suv精品一区二区五 | 久久人妻内射无码一区三区 | 日韩亚洲欧美精品综合 | 久久精品人人做人人综合试看 | 水蜜桃亚洲一二三四在线 | 人人爽人人澡人人人妻 | 亚洲高清偷拍一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 欧美日本免费一区二区三区 | 久久久成人毛片无码 | 亚洲色www成人永久网址 | 台湾无码一区二区 | 高中生自慰www网站 | 久久精品人妻少妇一区二区三区 | 漂亮人妻洗澡被公强 日日躁 | 国产精品亚洲五月天高清 | 在线 国产 欧美 亚洲 天堂 | 亚洲gv猛男gv无码男同 | 中文字幕av无码一区二区三区电影 | 日韩精品无码免费一区二区三区 | 国产午夜手机精彩视频 | 国产亚洲精品久久久久久久 | 久久无码专区国产精品s | 99精品国产综合久久久久五月天 | 熟妇人妻无乱码中文字幕 | 久久亚洲中文字幕精品一区 | 欧美丰满熟妇xxxx | 东京热一精品无码av | 黑人巨大精品欧美一区二区 | 日本熟妇乱子伦xxxx | 国产亚洲精品久久久久久久久动漫 | 乱中年女人伦av三区 | 国产三级精品三级男人的天堂 | 亚洲精品国产精品乱码视色 | 蜜臀av无码人妻精品 | 成人av无码一区二区三区 | 欧美黑人乱大交 | 国产亚洲视频中文字幕97精品 | 国产精品久久久久7777 | 国产网红无码精品视频 | 亚洲精品午夜国产va久久成人 | 亚洲男人av天堂午夜在 | 伊人久久婷婷五月综合97色 | 日韩av无码中文无码电影 | 免费网站看v片在线18禁无码 | av在线亚洲欧洲日产一区二区 | 鲁大师影院在线观看 | 无码中文字幕色专区 | 色欲av亚洲一区无码少妇 | 久久99精品国产.久久久久 | 香港三级日本三级妇三级 | 亚洲国产av美女网站 | 中国大陆精品视频xxxx | 色五月五月丁香亚洲综合网 | 国产精品无码一区二区桃花视频 | 成人一在线视频日韩国产 | 荫蒂被男人添的好舒服爽免费视频 | 高潮毛片无遮挡高清免费 | 蜜臀av无码人妻精品 | 成人片黄网站色大片免费观看 | 亚洲最大成人网站 | 国产精品爱久久久久久久 | 牲交欧美兽交欧美 | а√天堂www在线天堂小说 | 成人无码视频在线观看网站 | 免费人成网站视频在线观看 | 国产明星裸体无码xxxx视频 | 粉嫩少妇内射浓精videos | 蜜桃av抽搐高潮一区二区 | 久久综合狠狠综合久久综合88 | 国产精品久久久午夜夜伦鲁鲁 | 久久国内精品自在自线 | 麻豆人妻少妇精品无码专区 | 国产亚洲精品久久久ai换 | 无码帝国www无码专区色综合 | 国产精品亚洲а∨无码播放麻豆 | 国产精品.xx视频.xxtv | 精品无码成人片一区二区98 | 亚洲日韩av一区二区三区中文 | 亚洲国产高清在线观看视频 | 国产热a欧美热a在线视频 | 中文字幕 人妻熟女 | 欧美日本精品一区二区三区 | 欧美日韩亚洲国产精品 | 1000部夫妻午夜免费 | 中文字幕乱码中文乱码51精品 | 色欲人妻aaaaaaa无码 | 无码人妻丰满熟妇区毛片18 | 日韩人妻无码一区二区三区久久99 | 国产后入清纯学生妹 | 一本无码人妻在中文字幕免费 | 免费播放一区二区三区 | 亚洲日韩av一区二区三区中文 | 亚洲一区二区三区在线观看网站 | 四十如虎的丰满熟妇啪啪 | 成人一区二区免费视频 | 日本高清一区免费中文视频 | 老熟妇仑乱视频一区二区 | 日本爽爽爽爽爽爽在线观看免 | 麻豆国产97在线 | 欧洲 | 国内精品人妻无码久久久影院 | 欧美精品免费观看二区 | 久久无码专区国产精品s | 欧美午夜特黄aaaaaa片 | 久久 国产 尿 小便 嘘嘘 | 伊人久久大香线蕉午夜 | 国产情侣作爱视频免费观看 | 国产小呦泬泬99精品 | 天堂久久天堂av色综合 | 蜜臀av在线播放 久久综合激激的五月天 | 强开小婷嫩苞又嫩又紧视频 | 色五月五月丁香亚洲综合网 | 亚洲 另类 在线 欧美 制服 | 野狼第一精品社区 | 国产成人精品无码播放 | 精品无码一区二区三区的天堂 | 大色综合色综合网站 | 午夜无码人妻av大片色欲 | 成 人 网 站国产免费观看 | 欧美阿v高清资源不卡在线播放 | 日本免费一区二区三区最新 | 欧美一区二区三区 | 国产成人无码av一区二区 | 俄罗斯老熟妇色xxxx | 伊人久久大香线蕉亚洲 | 亚洲人成影院在线无码按摩店 | 暴力强奷在线播放无码 | 国产香蕉尹人综合在线观看 | 国产真人无遮挡作爱免费视频 | 疯狂三人交性欧美 | 一个人看的视频www在线 | 动漫av一区二区在线观看 | 永久免费精品精品永久-夜色 | 国产麻豆精品精东影业av网站 | 中文字幕无码av激情不卡 | 国产亚洲精品久久久闺蜜 | 日韩人妻系列无码专区 | 欧美三级不卡在线观看 | 亚洲经典千人经典日产 | 日产精品99久久久久久 | 国产在线精品一区二区高清不卡 | 亚洲精品一区二区三区在线 | 精品无人区无码乱码毛片国产 | 少妇被粗大的猛进出69影院 | 色婷婷av一区二区三区之红樱桃 | 蜜桃视频插满18在线观看 | 国产人妻精品午夜福利免费 | 好爽又高潮了毛片免费下载 | 蜜桃视频插满18在线观看 | 无码中文字幕色专区 | 精品厕所偷拍各类美女tp嘘嘘 | 性开放的女人aaa片 | 色噜噜亚洲男人的天堂 | 最新国产麻豆aⅴ精品无码 | 久久 国产 尿 小便 嘘嘘 | 美女张开腿让人桶 | 在线天堂新版最新版在线8 | 亚洲国产欧美日韩精品一区二区三区 | 欧美变态另类xxxx | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 影音先锋中文字幕无码 | 国产精品第一国产精品 | 亚洲国产精品美女久久久久 | 少妇激情av一区二区 | 国产色精品久久人妻 | 亚洲日本va午夜在线电影 | 欧美高清在线精品一区 | 又粗又大又硬毛片免费看 | 国产亚洲美女精品久久久2020 | 天堂久久天堂av色综合 | 无码成人精品区在线观看 | 欧美亚洲日韩国产人成在线播放 | 少妇性l交大片 | 秋霞成人午夜鲁丝一区二区三区 | 99久久精品国产一区二区蜜芽 | 中文字幕乱码人妻无码久久 | 国产亲子乱弄免费视频 | 性做久久久久久久久 | 一个人看的视频www在线 | 桃花色综合影院 | 天堂亚洲免费视频 | 午夜精品一区二区三区在线观看 | 无码国产乱人伦偷精品视频 | 一二三四在线观看免费视频 | 精品偷拍一区二区三区在线看 | 搡女人真爽免费视频大全 | 在线播放无码字幕亚洲 | 色综合久久久久综合一本到桃花网 | 日日天日日夜日日摸 | 色综合久久久无码网中文 | 欧美成人免费全部网站 | 色欲av亚洲一区无码少妇 | 国产另类ts人妖一区二区 | 无码毛片视频一区二区本码 | 久久午夜无码鲁丝片秋霞 | 免费视频欧美无人区码 | 久久伊人色av天堂九九小黄鸭 | 日韩无套无码精品 | 亚洲区欧美区综合区自拍区 | 久久久精品456亚洲影院 | 亚洲爆乳精品无码一区二区三区 | 中国大陆精品视频xxxx | 蜜桃臀无码内射一区二区三区 | 中国女人内谢69xxxx | 激情内射亚州一区二区三区爱妻 | 久久精品无码一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 亚洲人成网站在线播放942 | 撕开奶罩揉吮奶头视频 | 亚洲区欧美区综合区自拍区 | 一个人看的www免费视频在线观看 | 国产午夜无码视频在线观看 | 国产又爽又猛又粗的视频a片 | 毛片内射-百度 | 亚洲区欧美区综合区自拍区 | 永久免费观看国产裸体美女 | 狂野欧美激情性xxxx | 国产在线aaa片一区二区99 | 妺妺窝人体色www在线小说 | 狠狠色噜噜狠狠狠7777奇米 | 撕开奶罩揉吮奶头视频 | 黑人大群体交免费视频 | 免费人成在线视频无码 | 日韩精品乱码av一区二区 | 日日碰狠狠躁久久躁蜜桃 | 人人妻人人澡人人爽欧美一区 | 亚洲欧美精品伊人久久 | 内射老妇bbwx0c0ck | 久久精品国产一区二区三区 | 精品久久久久久亚洲精品 | 成人试看120秒体验区 | 一本色道婷婷久久欧美 | 中文字幕无码热在线视频 | 少妇无套内谢久久久久 | 亚洲人成人无码网www国产 | 波多野结衣一区二区三区av免费 | 香港三级日本三级妇三级 | 国产人妻人伦精品1国产丝袜 | 精品国产成人一区二区三区 | 在线播放免费人成毛片乱码 | 伊人久久大香线焦av综合影院 | 久久久无码中文字幕久... | 少妇人妻av毛片在线看 | 国产人妻大战黑人第1集 | 午夜熟女插插xx免费视频 | 少妇愉情理伦片bd | 乌克兰少妇xxxx做受 | 亚欧洲精品在线视频免费观看 | 在线欧美精品一区二区三区 | 午夜成人1000部免费视频 | 国产综合久久久久鬼色 | 久久久无码中文字幕久... | 性啪啪chinese东北女人 | 亚洲经典千人经典日产 | 日本又色又爽又黄的a片18禁 | 美女黄网站人色视频免费国产 | 午夜精品久久久久久久 | 丰满妇女强制高潮18xxxx | 在线亚洲高清揄拍自拍一品区 | 国产成人无码a区在线观看视频app | 欧美国产日韩亚洲中文 | 免费无码av一区二区 | 国产av剧情md精品麻豆 | 性生交片免费无码看人 | 四虎影视成人永久免费观看视频 | 男女性色大片免费网站 | 亚洲日韩中文字幕在线播放 | 色欲久久久天天天综合网精品 | 日本免费一区二区三区最新 | 大肉大捧一进一出好爽视频 | 国产在线精品一区二区高清不卡 | 无遮挡啪啪摇乳动态图 | 中文字幕日韩精品一区二区三区 | 国产在线aaa片一区二区99 | 日本在线高清不卡免费播放 | 无码播放一区二区三区 | 日本一本二本三区免费 | 色一情一乱一伦一视频免费看 | 超碰97人人做人人爱少妇 | 色偷偷人人澡人人爽人人模 | 久久无码专区国产精品s | 国产亚洲欧美在线专区 | 国产无遮挡吃胸膜奶免费看 | 久久综合网欧美色妞网 | 亚洲爆乳精品无码一区二区三区 | 精品成人av一区二区三区 | 亚洲精品综合一区二区三区在线 | 亚洲精品午夜国产va久久成人 | 国模大胆一区二区三区 | 国产熟妇另类久久久久 | 久久国产精品精品国产色婷婷 | 亲嘴扒胸摸屁股激烈网站 | 国产极品美女高潮无套在线观看 | 欧美 亚洲 国产 另类 | 中文字幕乱码中文乱码51精品 | 又湿又紧又大又爽a视频国产 | 鲁一鲁av2019在线 | 欧洲精品码一区二区三区免费看 | 双乳奶水饱满少妇呻吟 | 强伦人妻一区二区三区视频18 | 97久久精品无码一区二区 | 国产精品久久久久久亚洲毛片 | 97夜夜澡人人双人人人喊 | 一本色道久久综合亚洲精品不卡 | 亚洲一区二区观看播放 | 特级做a爰片毛片免费69 | 黑森林福利视频导航 | 丝袜 中出 制服 人妻 美腿 | 中文字幕无码av激情不卡 | 少妇被粗大的猛进出69影院 | av无码久久久久不卡免费网站 | 亚洲国产欧美在线成人 | 麻豆国产丝袜白领秘书在线观看 | 欧美精品在线观看 | ass日本丰满熟妇pics | 无码精品人妻一区二区三区av | 97se亚洲精品一区 | 亲嘴扒胸摸屁股激烈网站 | 久久精品国产99精品亚洲 | 最新国产麻豆aⅴ精品无码 | 日韩精品无码一本二本三本色 | 高潮毛片无遮挡高清免费视频 | 欧美第一黄网免费网站 | 欧美 日韩 亚洲 在线 | 在教室伦流澡到高潮hnp视频 | 大地资源网第二页免费观看 | 久久亚洲精品成人无码 | 成人精品视频一区二区三区尤物 | 久久精品中文字幕一区 | 麻豆果冻传媒2021精品传媒一区下载 | 国产激情艳情在线看视频 | 粗大的内捧猛烈进出视频 | 中文字幕无码日韩专区 | 人人妻人人澡人人爽人人精品 | 色综合天天综合狠狠爱 | 久久久无码中文字幕久... | 伊在人天堂亚洲香蕉精品区 | 久久久中文字幕日本无吗 | 欧洲熟妇精品视频 | 久久99国产综合精品 | 无码免费一区二区三区 | 色综合视频一区二区三区 | 亚洲区小说区激情区图片区 | 国产午夜视频在线观看 | 少妇无码av无码专区在线观看 | 久久精品一区二区三区四区 | 国产人妻人伦精品1国产丝袜 | 乱中年女人伦av三区 | 国产疯狂伦交大片 | 国产乱人伦偷精品视频 | 综合网日日天干夜夜久久 | 精品国产国产综合精品 | 国产亚洲人成a在线v网站 | 一本色道久久综合亚洲精品不卡 | 国产人妻久久精品二区三区老狼 | 免费无码av一区二区 | 日韩av无码一区二区三区不卡 | 久久国内精品自在自线 | 亚洲精品国偷拍自产在线麻豆 | 欧美真人作爱免费视频 | 欧美放荡的少妇 | 波多野结衣 黑人 | 激情亚洲一区国产精品 | 久久久www成人免费毛片 | 国产69精品久久久久app下载 | 国产精品丝袜黑色高跟鞋 | 成人三级无码视频在线观看 | ass日本丰满熟妇pics | 青青草原综合久久大伊人精品 | 国产成人精品无码播放 | 亚洲国产精品毛片av不卡在线 | 永久免费观看国产裸体美女 | av无码不卡在线观看免费 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久精品国产精品国产精品污 | 欧美精品免费观看二区 | 国产suv精品一区二区五 | 玩弄少妇高潮ⅹxxxyw | 丝袜美腿亚洲一区二区 | 国产色精品久久人妻 | 曰本女人与公拘交酡免费视频 | 亚洲区欧美区综合区自拍区 | 欧美精品免费观看二区 | 亚洲国产综合无码一区 | 成在人线av无码免观看麻豆 | 精品国产一区二区三区av 性色 | 久久久久久久久888 | 美女极度色诱视频国产 | 日韩亚洲欧美中文高清在线 | 日本乱偷人妻中文字幕 | 熟妇激情内射com | 国产性生交xxxxx无码 | 在线观看国产午夜福利片 | 成 人影片 免费观看 | 中文字幕无线码免费人妻 | 色一情一乱一伦一视频免费看 | 久久精品一区二区三区四区 | 日本肉体xxxx裸交 | 亚洲色欲久久久综合网东京热 | 色一情一乱一伦一视频免费看 | 久久久久亚洲精品中文字幕 | 影音先锋中文字幕无码 | 欧美日韩视频无码一区二区三 | 亚洲综合色区中文字幕 | 国产综合色产在线精品 | 99久久无码一区人妻 | 日日摸夜夜摸狠狠摸婷婷 | 亚洲熟妇色xxxxx欧美老妇 | 亚无码乱人伦一区二区 | 永久免费观看美女裸体的网站 | 国产av一区二区精品久久凹凸 | 欧美国产日韩亚洲中文 | 东北女人啪啪对白 | 国产美女极度色诱视频www | www成人国产高清内射 | 午夜福利不卡在线视频 | 亚洲精品鲁一鲁一区二区三区 | 漂亮人妻洗澡被公强 日日躁 | 领导边摸边吃奶边做爽在线观看 | 欧美日韩久久久精品a片 | 天天av天天av天天透 | 久久熟妇人妻午夜寂寞影院 | 亚洲熟妇色xxxxx欧美老妇 | 性色av无码免费一区二区三区 | 亚洲中文字幕无码中文字在线 | 亚洲中文字幕成人无码 | ass日本丰满熟妇pics | 蜜臀av在线观看 在线欧美精品一区二区三区 | 国产两女互慰高潮视频在线观看 | 亚洲精品中文字幕 | 国产精品久久久久久久9999 | 免费人成在线视频无码 | 美女黄网站人色视频免费国产 | 亚洲成av人片在线观看无码不卡 | 日韩无码专区 | 性欧美videos高清精品 | 暴力强奷在线播放无码 | 又紧又大又爽精品一区二区 | 亚洲精品成a人在线观看 | 成 人 免费观看网站 | √天堂中文官网8在线 | 成 人 免费观看网站 | 两性色午夜视频免费播放 | 曰本女人与公拘交酡免费视频 | 亚洲欧美中文字幕5发布 | 欧美大屁股xxxxhd黑色 | 国产超碰人人爽人人做人人添 | 亚洲爆乳精品无码一区二区三区 | 免费无码的av片在线观看 | 亚洲综合伊人久久大杳蕉 | 精品久久久无码中文字幕 | 国产高清av在线播放 | 婷婷色婷婷开心五月四房播播 | 国产成人精品三级麻豆 | 国产精品a成v人在线播放 | 中文字幕av日韩精品一区二区 | 亚洲精品久久久久久一区二区 | 国产艳妇av在线观看果冻传媒 | 国产一精品一av一免费 | 又紧又大又爽精品一区二区 | 97久久精品无码一区二区 | 国产亚洲美女精品久久久2020 | 无码人妻少妇伦在线电影 | 日产国产精品亚洲系列 | 成人无码影片精品久久久 | 露脸叫床粗话东北少妇 | 偷窥日本少妇撒尿chinese | 人妻互换免费中文字幕 | 国产成人精品一区二区在线小狼 | 欧美日本精品一区二区三区 | 精品久久久无码人妻字幂 | 日韩精品一区二区av在线 | 国产乱码精品一品二品 | 51国偷自产一区二区三区 | 日欧一片内射va在线影院 | 亚洲精品国偷拍自产在线麻豆 | 日韩精品乱码av一区二区 | 粗大的内捧猛烈进出视频 | 午夜精品一区二区三区在线观看 | 欧美亚洲日韩国产人成在线播放 | 色综合久久久无码网中文 | 欧美一区二区三区视频在线观看 | 国产精品久久久久久无码 | 欧美zoozzooz性欧美 | 99久久婷婷国产综合精品青草免费 | 亚洲一区二区三区香蕉 | 国产精品高潮呻吟av久久4虎 | 国产精品久久久av久久久 | 成人无码精品一区二区三区 | 少妇性俱乐部纵欲狂欢电影 | 国产在线精品一区二区三区直播 | 亚洲热妇无码av在线播放 | 2020最新国产自产精品 | 人人爽人人澡人人人妻 | 精品人妻人人做人人爽夜夜爽 | 国内精品久久毛片一区二区 | 在线天堂新版最新版在线8 | 国产在线一区二区三区四区五区 | 久久精品一区二区三区四区 | 97人妻精品一区二区三区 | 麻豆国产人妻欲求不满 | 熟女体下毛毛黑森林 | 国产成人精品久久亚洲高清不卡 | 高潮毛片无遮挡高清免费视频 | 97精品人妻一区二区三区香蕉 | 真人与拘做受免费视频一 | 最近的中文字幕在线看视频 | 又湿又紧又大又爽a视频国产 | 国产精品久久久久久久影院 | av无码久久久久不卡免费网站 | 亲嘴扒胸摸屁股激烈网站 | 四十如虎的丰满熟妇啪啪 | 国产人妻精品午夜福利免费 | 精品人妻中文字幕有码在线 | 波多野结衣高清一区二区三区 | 久久久久亚洲精品中文字幕 | 噜噜噜亚洲色成人网站 | 日日天日日夜日日摸 | 欧美丰满老熟妇xxxxx性 | 精品无码国产自产拍在线观看蜜 | 奇米影视888欧美在线观看 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 欧美成人家庭影院 | 一本久道高清无码视频 | 99久久久无码国产精品免费 | 日本丰满熟妇videos | а天堂中文在线官网 | 亚洲熟妇色xxxxx欧美老妇y | 国产国产精品人在线视 | 久久综合久久自在自线精品自 | 人人爽人人澡人人人妻 | 中国女人内谢69xxxxxa片 | 亚洲成a人片在线观看无码 | 黑人巨大精品欧美黑寡妇 | 国产精品18久久久久久麻辣 | 亚洲成av人片在线观看无码不卡 | 久久久中文久久久无码 | 偷窥村妇洗澡毛毛多 | 欧美性黑人极品hd | 一本久久a久久精品vr综合 | 国产亚洲精品久久久ai换 | v一区无码内射国产 | 国产另类ts人妖一区二区 | 日韩精品无码免费一区二区三区 | 久久久久亚洲精品男人的天堂 | 久久精品无码一区二区三区 | 99麻豆久久久国产精品免费 | 国产成人无码午夜视频在线观看 | 亚洲男人av香蕉爽爽爽爽 | 久久伊人色av天堂九九小黄鸭 | 色一情一乱一伦一视频免费看 | 国产福利视频一区二区 | 麻豆人妻少妇精品无码专区 | 国产熟女一区二区三区四区五区 | 亚洲s色大片在线观看 | 欧美人妻一区二区三区 | 麻豆精品国产精华精华液好用吗 | 正在播放老肥熟妇露脸 | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | 乱人伦中文视频在线观看 | 熟女体下毛毛黑森林 | 性欧美熟妇videofreesex | 亚洲精品无码人妻无码 | 国产特级毛片aaaaaaa高清 | 亚洲日本一区二区三区在线 | 亚洲成色www久久网站 | 性开放的女人aaa片 | 色欲久久久天天天综合网精品 | 午夜福利不卡在线视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产小呦泬泬99精品 | 成人一区二区免费视频 | 亚洲国产精品美女久久久久 | 1000部夫妻午夜免费 | 中文字幕无码免费久久99 | 国产成人无码av一区二区 | 国语自产偷拍精品视频偷 | 亚洲国产一区二区三区在线观看 | 少妇愉情理伦片bd | 欧美三级不卡在线观看 | 夜先锋av资源网站 | 国产国语老龄妇女a片 | 亚洲精品综合五月久久小说 | 国产精品欧美成人 | 在线亚洲高清揄拍自拍一品区 | 久久五月精品中文字幕 | 少妇人妻av毛片在线看 | 中文字幕乱码人妻无码久久 | 国产日产欧产精品精品app | 亚洲精品成人av在线 | 日本又色又爽又黄的a片18禁 | 97资源共享在线视频 | √天堂中文官网8在线 | 亚洲欧美色中文字幕在线 | 岛国片人妻三上悠亚 | 少妇激情av一区二区 | 国产色视频一区二区三区 | 欧洲美熟女乱又伦 | 亚洲爆乳无码专区 | 国产亚洲精品久久久ai换 | 波多野结衣高清一区二区三区 | 国产特级毛片aaaaaa高潮流水 | 欧美人与动性行为视频 | 久久99精品国产麻豆 | 色狠狠av一区二区三区 | 国产麻豆精品精东影业av网站 | 国产麻豆精品一区二区三区v视界 | 亚欧洲精品在线视频免费观看 | 性色欲网站人妻丰满中文久久不卡 | 在线看片无码永久免费视频 | 亚洲日韩一区二区三区 | 中文字幕无码免费久久99 | 国产精品二区一区二区aⅴ污介绍 | 无码乱肉视频免费大全合集 | 人妻插b视频一区二区三区 | 无码av岛国片在线播放 | 亚洲国产欧美国产综合一区 | 成年美女黄网站色大免费视频 | 免费看少妇作爱视频 | 少妇性荡欲午夜性开放视频剧场 | 久久国产精品精品国产色婷婷 | 狠狠cao日日穞夜夜穞av | 99精品国产综合久久久久五月天 | 久久99精品国产.久久久久 | 国产精品二区一区二区aⅴ污介绍 | 伦伦影院午夜理论片 | 国产精品亚洲一区二区三区喷水 | 欧美高清在线精品一区 | 中国女人内谢69xxxx | 国产电影无码午夜在线播放 | 丁香啪啪综合成人亚洲 | 国产97人人超碰caoprom | 中文字幕+乱码+中文字幕一区 | 日日摸天天摸爽爽狠狠97 | 亚洲日韩av一区二区三区四区 | 香港三级日本三级妇三级 | 国产精品无套呻吟在线 | 国产做国产爱免费视频 | 国产精品毛多多水多 | 无码国内精品人妻少妇 | 天天做天天爱天天爽综合网 | 亚洲第一无码av无码专区 | 日日碰狠狠躁久久躁蜜桃 | 久久精品一区二区三区四区 | 九九久久精品国产免费看小说 | 麻豆国产人妻欲求不满 | 欧美乱妇无乱码大黄a片 | 秋霞成人午夜鲁丝一区二区三区 | 中文字幕无码免费久久99 | 国模大胆一区二区三区 | 午夜精品久久久内射近拍高清 | 国产精品久久久久久久9999 | 亚洲中文字幕无码中文字在线 | 精品人妻人人做人人爽夜夜爽 | 丰满人妻一区二区三区免费视频 | 欧美日本精品一区二区三区 | 国产av无码专区亚洲a∨毛片 | 亚洲精品美女久久久久久久 | 在线天堂新版最新版在线8 | 波多野结衣高清一区二区三区 | 在线观看免费人成视频 | 免费无码午夜福利片69 | 精品一区二区不卡无码av | 国产亚洲日韩欧美另类第八页 | 国产精品高潮呻吟av久久4虎 | 一个人看的视频www在线 | 亚洲午夜无码久久 | 一本加勒比波多野结衣 | 亚洲精品一区二区三区在线观看 | 欧美日本日韩 | 福利一区二区三区视频在线观看 | 中文字幕无码免费久久9一区9 | 亚洲综合无码久久精品综合 | 乌克兰少妇xxxx做受 | 99久久久无码国产aaa精品 | 国产又爽又黄又刺激的视频 | 午夜福利不卡在线视频 | 欧美第一黄网免费网站 | 午夜无码区在线观看 | 国产成人午夜福利在线播放 | 免费无码一区二区三区蜜桃大 | 亚洲精品久久久久久久久久久 | 日韩视频 中文字幕 视频一区 | 全黄性性激高免费视频 | 亚洲自偷自偷在线制服 | 久久久精品国产sm最大网站 | 波多野结衣aⅴ在线 | 亚洲理论电影在线观看 | 婷婷色婷婷开心五月四房播播 | 国产福利视频一区二区 | 少妇的肉体aa片免费 | 国产亚洲人成a在线v网站 | 国产69精品久久久久app下载 | 人妻少妇被猛烈进入中文字幕 | 少妇高潮喷潮久久久影院 | 国产午夜无码视频在线观看 | 99精品国产综合久久久久五月天 | 嫩b人妻精品一区二区三区 | 亚洲综合无码一区二区三区 | 国产小呦泬泬99精品 | 国产成人无码一二三区视频 | 99久久人妻精品免费二区 | 国产亚洲tv在线观看 | 久久久久99精品国产片 | 人人澡人人妻人人爽人人蜜桃 | 人妻无码久久精品人妻 | 女人被男人爽到呻吟的视频 | 波多野结衣高清一区二区三区 | 婷婷五月综合缴情在线视频 | 亚洲中文字幕av在天堂 | 国产疯狂伦交大片 | 国产精品久久久一区二区三区 | 久久精品中文字幕大胸 | 久久国产精品二国产精品 | 国产精品亚洲一区二区三区喷水 | 老头边吃奶边弄进去呻吟 | 亚洲国产高清在线观看视频 | 亚洲精品鲁一鲁一区二区三区 | 女人高潮内射99精品 | 国产欧美熟妇另类久久久 | 日日碰狠狠躁久久躁蜜桃 | 国产精品亚洲а∨无码播放麻豆 | 乱码av麻豆丝袜熟女系列 | 亚洲精品一区二区三区在线观看 | 日欧一片内射va在线影院 | 伊人久久大香线蕉亚洲 | 国产午夜亚洲精品不卡下载 | 日韩欧美群交p片內射中文 | 欧美日本免费一区二区三区 | 久久久www成人免费毛片 | 国产精品国产三级国产专播 | 波多野结衣av一区二区全免费观看 | 日本大乳高潮视频在线观看 | 午夜肉伦伦影院 | 国产性生大片免费观看性 | 亚洲国产午夜精品理论片 | 牲欲强的熟妇农村老妇女视频 | 99久久久无码国产aaa精品 | 国产三级久久久精品麻豆三级 | 国产绳艺sm调教室论坛 | 全球成人中文在线 | 亚洲一区二区三区无码久久 | 激情人妻另类人妻伦 | 亚洲欧美中文字幕5发布 | 国产色视频一区二区三区 | 高中生自慰www网站 | 国产精品a成v人在线播放 | 日本一区二区三区免费播放 | 白嫩日本少妇做爰 | 日韩精品无码免费一区二区三区 | 午夜福利电影 | 亚洲日本va午夜在线电影 | 一本精品99久久精品77 | 精品少妇爆乳无码av无码专区 | 久久精品99久久香蕉国产色戒 | 久久99久久99精品中文字幕 | 国产精品亚洲专区无码不卡 | 国产成人无码午夜视频在线观看 | 东京热一精品无码av | 亚洲精品国产精品乱码视色 | 亚洲日韩中文字幕在线播放 | 欧美熟妇另类久久久久久多毛 | 国产精华av午夜在线观看 | 久久天天躁狠狠躁夜夜免费观看 | 欧美三级不卡在线观看 | 荫蒂被男人添的好舒服爽免费视频 | 精品久久久中文字幕人妻 | 日韩欧美中文字幕公布 | 亚洲春色在线视频 | 51国偷自产一区二区三区 | 精品偷自拍另类在线观看 | 国产 浪潮av性色四虎 | 国产熟女一区二区三区四区五区 | 天天躁日日躁狠狠躁免费麻豆 | 国产人妻大战黑人第1集 | 国产在线一区二区三区四区五区 | 未满成年国产在线观看 | 欧美老人巨大xxxx做受 | 精品一二三区久久aaa片 | 亚洲成a人片在线观看日本 | 一个人看的www免费视频在线观看 | 最近免费中文字幕中文高清百度 | 日韩av无码一区二区三区 | 亚洲国产精品无码久久久久高潮 | 日本在线高清不卡免费播放 | 蜜桃视频韩日免费播放 | 偷窥日本少妇撒尿chinese | 一本大道久久东京热无码av | 女人被男人躁得好爽免费视频 | 中文字幕无码av激情不卡 | 黑人巨大精品欧美一区二区 | 欧美 亚洲 国产 另类 | 图片区 小说区 区 亚洲五月 | 中文字幕人妻丝袜二区 | 亚洲国产综合无码一区 | 国产香蕉尹人综合在线观看 | 国产人妻人伦精品1国产丝袜 | 国产精品久久久久9999小说 | 久久精品国产一区二区三区肥胖 | 99精品国产综合久久久久五月天 | 性色av无码免费一区二区三区 | 亚洲中文字幕乱码av波多ji | 欧美成人免费全部网站 | 国产成人精品必看 | 国産精品久久久久久久 | 国模大胆一区二区三区 | 亚洲精品国偷拍自产在线观看蜜桃 | 国产精品自产拍在线观看 | 色五月丁香五月综合五月 | 桃花色综合影院 | 久久综合网欧美色妞网 | 欧美性黑人极品hd | aⅴ在线视频男人的天堂 | 少妇性荡欲午夜性开放视频剧场 | 99精品无人区乱码1区2区3区 | 日本又色又爽又黄的a片18禁 | 亚洲精品久久久久中文第一幕 | 日韩av无码一区二区三区 | 久久这里只有精品视频9 | 亚洲色成人中文字幕网站 | 曰本女人与公拘交酡免费视频 | 欧美黑人巨大xxxxx | 欧洲精品码一区二区三区免费看 | 十八禁真人啪啪免费网站 | 鲁一鲁av2019在线 | 久久99精品久久久久久动态图 | 亚洲成av人影院在线观看 | 国内揄拍国内精品少妇国语 | 麻豆av传媒蜜桃天美传媒 | 性色av无码免费一区二区三区 | 欧美亚洲国产一区二区三区 | 国产乱人伦偷精品视频 | 日韩亚洲欧美精品综合 | 国产手机在线αⅴ片无码观看 | 亚洲成熟女人毛毛耸耸多 | 亚洲人成网站免费播放 | 亚洲日本一区二区三区在线 | 久久久久av无码免费网 | 亚洲 日韩 欧美 成人 在线观看 | 久久精品视频在线看15 | 76少妇精品导航 | 亚洲s色大片在线观看 | 给我免费的视频在线观看 | 亚洲成av人综合在线观看 | 小泽玛莉亚一区二区视频在线 | 国产无遮挡吃胸膜奶免费看 | 青青青手机频在线观看 | 亚洲男女内射在线播放 | 色婷婷综合中文久久一本 | 亚洲熟妇色xxxxx欧美老妇 | 欧美成人午夜精品久久久 | 国产午夜福利100集发布 | 欧美日韩一区二区综合 | 国产精品嫩草久久久久 | 天天综合网天天综合色 | 亚洲综合久久一区二区 | 久久99国产综合精品 | 免费国产成人高清在线观看网站 | 丰满护士巨好爽好大乳 | 99久久久无码国产精品免费 | 一本色道久久综合亚洲精品不卡 | 中文字幕无码av激情不卡 | 欧美日本精品一区二区三区 | 西西人体www44rt大胆高清 | 国产激情精品一区二区三区 | 精品国产精品久久一区免费式 | 国内综合精品午夜久久资源 | 亚洲乱码中文字幕在线 | 国内揄拍国内精品少妇国语 | 亚洲狠狠婷婷综合久久 | 久久精品国产一区二区三区肥胖 | 97se亚洲精品一区 | 国产午夜无码视频在线观看 | 欧美三级不卡在线观看 | 永久黄网站色视频免费直播 | 久久人人爽人人爽人人片av高清 | 亚洲国产av美女网站 | 樱花草在线播放免费中文 | 国产精品久久久久无码av色戒 | 精品欧洲av无码一区二区三区 | 欧美人与物videos另类 | 久久久www成人免费毛片 | 国产明星裸体无码xxxx视频 | 国产国产精品人在线视 | 成人欧美一区二区三区黑人 | 香蕉久久久久久av成人 | 久久精品一区二区三区四区 | 天堂一区人妻无码 | 欧美人与物videos另类 | 中文字幕日产无线码一区 | 亚洲色偷偷偷综合网 | 中文字幕av日韩精品一区二区 | 在线精品国产一区二区三区 | 亚洲日韩中文字幕在线播放 | 成人aaa片一区国产精品 | 久久精品女人天堂av免费观看 | 色一情一乱一伦一区二区三欧美 | 亚洲精品无码人妻无码 | 99久久久国产精品无码免费 | 无遮挡啪啪摇乳动态图 | 久久精品女人天堂av免费观看 | 丰满人妻翻云覆雨呻吟视频 | 无码人妻少妇伦在线电影 | 性生交大片免费看女人按摩摩 | 午夜不卡av免费 一本久久a久久精品vr综合 | 亚洲国产精品无码久久久久高潮 | 久久精品人人做人人综合试看 | a片免费视频在线观看 | 麻豆成人精品国产免费 | 成人免费无码大片a毛片 | 欧美熟妇另类久久久久久不卡 | 久久精品视频在线看15 | 女人被男人爽到呻吟的视频 | 国产香蕉尹人综合在线观看 | 999久久久国产精品消防器材 | 久久伊人色av天堂九九小黄鸭 | 亚洲国产av精品一区二区蜜芽 | 国产成人精品必看 | 丝袜美腿亚洲一区二区 | 成年美女黄网站色大免费全看 | 女高中生第一次破苞av | 国产激情无码一区二区 | 亚洲中文字幕成人无码 | 精品久久久久香蕉网 | 奇米影视888欧美在线观看 | 伊人久久大香线蕉亚洲 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 蜜臀av无码人妻精品 | 欧美第一黄网免费网站 | 久久精品国产99久久6动漫 | 成人无码精品一区二区三区 | 亚洲日本va中文字幕 | 久久五月精品中文字幕 | 美女黄网站人色视频免费国产 | 又黄又爽又色的视频 | 99re在线播放 | 免费网站看v片在线18禁无码 | 国精品人妻无码一区二区三区蜜柚 | 亚洲一区二区三区偷拍女厕 | 亚洲成a人片在线观看日本 | 在线亚洲高清揄拍自拍一品区 | 一二三四在线观看免费视频 | 久久这里只有精品视频9 | 最近免费中文字幕中文高清百度 | 久久伊人色av天堂九九小黄鸭 | 5858s亚洲色大成网站www | 内射后入在线观看一区 | 国产乱子伦视频在线播放 | 国内精品久久久久久中文字幕 | 国产精品对白交换视频 | 老熟妇仑乱视频一区二区 | 天堂无码人妻精品一区二区三区 | a国产一区二区免费入口 | 亚洲一区二区三区含羞草 | 免费播放一区二区三区 | 黑森林福利视频导航 | 国产午夜福利亚洲第一 | 国产网红无码精品视频 | 日韩人妻系列无码专区 | 18无码粉嫩小泬无套在线观看 | 国产精华av午夜在线观看 | 国产亚洲tv在线观看 | 精品国偷自产在线 | 欧美国产日韩亚洲中文 | 在线a亚洲视频播放在线观看 | 免费看少妇作爱视频 | 精品偷自拍另类在线观看 | 亚洲国产精品久久久天堂 | 99在线 | 亚洲 | 99久久久无码国产精品免费 | 亚洲欧洲日本无在线码 | 欧美 亚洲 国产 另类 | 精品国产一区二区三区四区 | 亚洲中文字幕无码中字 | 男女爱爱好爽视频免费看 | 激情国产av做激情国产爱 | 国产绳艺sm调教室论坛 | 久久精品丝袜高跟鞋 | 久久无码中文字幕免费影院蜜桃 | 久久国产精品萌白酱免费 | 性欧美疯狂xxxxbbbb | 又色又爽又黄的美女裸体网站 | 无码国内精品人妻少妇 | 荫蒂被男人添的好舒服爽免费视频 | 精品国产av色一区二区深夜久久 | 亚洲精品国产品国语在线观看 | 天天做天天爱天天爽综合网 | 国产日产欧产精品精品app | 兔费看少妇性l交大片免费 | 久久精品国产99久久6动漫 | 精品无码国产自产拍在线观看蜜 | 亚洲成av人片在线观看无码不卡 | 两性色午夜视频免费播放 | 日日摸日日碰夜夜爽av | 国模大胆一区二区三区 | 少妇激情av一区二区 | 亚洲阿v天堂在线 | 欧美激情一区二区三区成人 | 国产特级毛片aaaaaaa高清 | 日本免费一区二区三区最新 | 久久综合九色综合97网 | 亚洲国产精品一区二区美利坚 | 天天躁日日躁狠狠躁免费麻豆 | 俺去俺来也在线www色官网 | 国产又爽又黄又刺激的视频 | 无遮挡国产高潮视频免费观看 | 中文无码成人免费视频在线观看 | www国产精品内射老师 | 日本肉体xxxx裸交 | 中文字幕av无码一区二区三区电影 | 久久久久久国产精品无码下载 | 国产另类ts人妖一区二区 | 国产成人精品优优av | 国产极品美女高潮无套在线观看 | 国产人妻精品一区二区三区不卡 | 理论片87福利理论电影 | 国产亚洲欧美日韩亚洲中文色 | 一本精品99久久精品77 | 99国产精品白浆在线观看免费 | 国产精品a成v人在线播放 | 亚洲中文字幕无码一久久区 | 一二三四在线观看免费视频 | 国产精品久久久久久久影院 | 67194成是人免费无码 | 亚洲 日韩 欧美 成人 在线观看 | 熟女少妇人妻中文字幕 | 色综合天天综合狠狠爱 | 精品熟女少妇av免费观看 | 无码人妻丰满熟妇区五十路百度 | 午夜无码区在线观看 | av在线亚洲欧洲日产一区二区 | 亚洲自偷自拍另类第1页 | 久久综合九色综合97网 | 97se亚洲精品一区 | 水蜜桃亚洲一二三四在线 | 国产黑色丝袜在线播放 | 欧美性生交活xxxxxdddd | 日日碰狠狠丁香久燥 | 成人女人看片免费视频放人 | 国产在线精品一区二区高清不卡 | 亚洲色欲色欲天天天www | 欧美激情内射喷水高潮 | 国产亲子乱弄免费视频 | 久精品国产欧美亚洲色aⅴ大片 | 99久久精品无码一区二区毛片 | 欧洲熟妇色 欧美 | 国产精品国产三级国产专播 | 久久久久se色偷偷亚洲精品av | 色窝窝无码一区二区三区色欲 | 亚洲精品国偷拍自产在线麻豆 | 国产成人精品一区二区在线小狼 | 人人妻人人澡人人爽欧美精品 | 国产亚洲精品久久久久久国模美 | 少妇一晚三次一区二区三区 | 国产亚av手机在线观看 | 99视频精品全部免费免费观看 | 亚洲乱码中文字幕在线 | 东京热一精品无码av | 日本一区二区更新不卡 | 强伦人妻一区二区三区视频18 | 欧美35页视频在线观看 | 国产肉丝袜在线观看 | 任你躁国产自任一区二区三区 | 国产sm调教视频在线观看 | 国产三级精品三级男人的天堂 | 人妻少妇精品无码专区二区 | 国产九九九九九九九a片 | 色五月丁香五月综合五月 | 色狠狠av一区二区三区 | 国产精品久久久久影院嫩草 | 国产精品亚洲综合色区韩国 | а√天堂www在线天堂小说 | 国产卡一卡二卡三 | 国产精品久久久午夜夜伦鲁鲁 | 亚洲伊人久久精品影院 | 荫蒂被男人添的好舒服爽免费视频 | 又黄又爽又色的视频 | 久久久久免费看成人影片 | 国产超碰人人爽人人做人人添 | 国产精品久久久久无码av色戒 | 中文字幕av伊人av无码av | 澳门永久av免费网站 | 蜜桃av抽搐高潮一区二区 | 久久久中文字幕日本无吗 | 永久免费观看国产裸体美女 | 一本久久a久久精品vr综合 | 99久久99久久免费精品蜜桃 | 亚洲精品一区二区三区婷婷月 | av在线亚洲欧洲日产一区二区 | 在线播放亚洲第一字幕 | 国内揄拍国内精品少妇国语 | 国产偷国产偷精品高清尤物 | 精品无码一区二区三区的天堂 | 亚洲精品www久久久 | 97夜夜澡人人双人人人喊 | 人妻插b视频一区二区三区 | 99er热精品视频 | 日本在线高清不卡免费播放 | 97久久超碰中文字幕 | 熟妇激情内射com | 狂野欧美性猛xxxx乱大交 | 久久亚洲精品中文字幕无男同 | 久久国语露脸国产精品电影 | 亚洲国产精品毛片av不卡在线 | 一二三四社区在线中文视频 | 少妇人妻偷人精品无码视频 | 欧美丰满少妇xxxx性 | 精品一区二区三区波多野结衣 | 国产欧美亚洲精品a | 无码毛片视频一区二区本码 | 欧美激情内射喷水高潮 | 成人一在线视频日韩国产 | 日本大乳高潮视频在线观看 | 亚洲日韩一区二区三区 | 中文字幕无码热在线视频 | 成人精品一区二区三区中文字幕 | 亚洲国产欧美国产综合一区 | 自拍偷自拍亚洲精品10p | 亚洲乱码日产精品bd | 在线播放免费人成毛片乱码 | 我要看www免费看插插视频 | 日本欧美一区二区三区乱码 | 天干天干啦夜天干天2017 | 亚洲国产成人a精品不卡在线 | 女人高潮内射99精品 | 人妻互换免费中文字幕 | 天天躁日日躁狠狠躁免费麻豆 | 粉嫩少妇内射浓精videos | 水蜜桃色314在线观看 | 久久精品中文字幕一区 | av在线亚洲欧洲日产一区二区 | 国产精品久久久久影院嫩草 | 377p欧洲日本亚洲大胆 | 18黄暴禁片在线观看 | 亚洲色偷偷偷综合网 | 亚洲国产精品成人久久蜜臀 | 少妇无码av无码专区在线观看 | 欧美黑人乱大交 | 国产深夜福利视频在线 | 成 人 免费观看网站 | 亚洲人交乣女bbw | 红桃av一区二区三区在线无码av | 永久黄网站色视频免费直播 | 国产成人综合美国十次 | 亚洲精品欧美二区三区中文字幕 | 成人免费视频视频在线观看 免费 | 亚洲国产欧美在线成人 | 国产亚洲欧美日韩亚洲中文色 | aⅴ在线视频男人的天堂 | 欧美兽交xxxx×视频 | 在线观看欧美一区二区三区 | 国产精品亚洲五月天高清 | 欧美激情综合亚洲一二区 | 999久久久国产精品消防器材 | 精品国产精品久久一区免费式 | 女人被男人躁得好爽免费视频 | 欧洲精品码一区二区三区免费看 | 中文精品久久久久人妻不卡 | 国产成人一区二区三区在线观看 | 99久久精品无码一区二区毛片 | 亚洲一区二区三区在线观看网站 | 蜜桃视频韩日免费播放 | 久久综合久久自在自线精品自 | 亚洲国产午夜精品理论片 | 综合网日日天干夜夜久久 | 久久伊人色av天堂九九小黄鸭 | 久久综合给久久狠狠97色 | 正在播放老肥熟妇露脸 | 中文字幕人妻无码一夲道 | 久青草影院在线观看国产 | 人人澡人摸人人添 | 精品午夜福利在线观看 | 亚洲欧洲中文日韩av乱码 | 国产乱码精品一品二品 | 精品无码一区二区三区爱欲 | 亚洲成av人综合在线观看 | 亚洲精品欧美二区三区中文字幕 | 欧美丰满少妇xxxx性 | 97久久国产亚洲精品超碰热 | 水蜜桃av无码 | 伊人色综合久久天天小片 | 亚洲精品国产精品乱码视色 | 精品国精品国产自在久国产87 | 亚洲人亚洲人成电影网站色 | 日本丰满护士爆乳xxxx | 99久久亚洲精品无码毛片 | 国内精品久久毛片一区二区 | 国内少妇偷人精品视频 | 午夜免费福利小电影 | 久久久久久a亚洲欧洲av冫 | 国产网红无码精品视频 | 成人欧美一区二区三区黑人免费 | 欧美放荡的少妇 | 国产成人亚洲综合无码 | 成人av无码一区二区三区 | 色诱久久久久综合网ywww | 美女毛片一区二区三区四区 | 中文字幕无码日韩欧毛 | av在线亚洲欧洲日产一区二区 | 天堂久久天堂av色综合 | 狠狠cao日日穞夜夜穞av | 内射欧美老妇wbb | 欧美日韩久久久精品a片 | 男人的天堂av网站 | 亚洲精品一区二区三区大桥未久 | 性生交大片免费看l | 久久精品人妻少妇一区二区三区 | 荫蒂被男人添的好舒服爽免费视频 | 国产精品对白交换视频 | 伊人久久婷婷五月综合97色 | 精品成人av一区二区三区 | 300部国产真实乱 | 水蜜桃色314在线观看 | 乱码午夜-极国产极内射 | 18精品久久久无码午夜福利 | 骚片av蜜桃精品一区 | 18禁止看的免费污网站 | 亚洲综合在线一区二区三区 | 无码人妻丰满熟妇区五十路百度 | 国产av人人夜夜澡人人爽麻豆 | 亚洲国产精品久久久天堂 | 中文字幕日韩精品一区二区三区 | 日本va欧美va欧美va精品 | 国产精品久久久久久久影院 | 沈阳熟女露脸对白视频 | 最新国产麻豆aⅴ精品无码 | 成人无码精品1区2区3区免费看 | 伊人色综合久久天天小片 | 亚洲成av人影院在线观看 | 色婷婷久久一区二区三区麻豆 | 国产色视频一区二区三区 | 亚洲国产精品毛片av不卡在线 | 少妇久久久久久人妻无码 | 午夜性刺激在线视频免费 | 欧美日韩人成综合在线播放 | 国产精品第一区揄拍无码 | 亚洲乱码日产精品bd | 国产一区二区不卡老阿姨 | 亚洲の无码国产の无码影院 | 欧美老妇交乱视频在线观看 | 日本精品少妇一区二区三区 | 黑人巨大精品欧美黑寡妇 | 国产精品va在线观看无码 | 亚洲欧洲中文日韩av乱码 | 久久精品国产日本波多野结衣 | 日欧一片内射va在线影院 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 亚洲男人av天堂午夜在 | 精品 日韩 国产 欧美 视频 | 亚洲精品一区二区三区婷婷月 | 日日躁夜夜躁狠狠躁 | 天堂无码人妻精品一区二区三区 | 久久久国产一区二区三区 | 亚洲一区二区三区四区 | 麻豆人妻少妇精品无码专区 | 爆乳一区二区三区无码 | 欧美熟妇另类久久久久久多毛 | 欧美黑人乱大交 | 亚洲国产精品无码久久久久高潮 | 亚洲综合无码久久精品综合 | 理论片87福利理论电影 | 久久久久成人精品免费播放动漫 | 日韩欧美中文字幕公布 | 国产亚洲人成在线播放 | 高潮毛片无遮挡高清免费视频 | 少妇无套内谢久久久久 | 美女黄网站人色视频免费国产 | 欧美熟妇另类久久久久久不卡 | 无码人妻出轨黑人中文字幕 | 狂野欧美性猛xxxx乱大交 | 国产成人综合色在线观看网站 | 亚洲成av人片在线观看无码不卡 | 亚洲熟妇色xxxxx欧美老妇 | 又粗又大又硬毛片免费看 | 人妻少妇精品视频专区 | 中文字幕人妻无码一夲道 | 亚洲成色在线综合网站 | 激情五月综合色婷婷一区二区 | 成 人 网 站国产免费观看 | 青青草原综合久久大伊人精品 | 全黄性性激高免费视频 | 国产精品自产拍在线观看 | 精品人妻中文字幕有码在线 | 欧美自拍另类欧美综合图片区 | 国産精品久久久久久久 | 日韩精品一区二区av在线 | 久久无码专区国产精品s | 少妇人妻偷人精品无码视频 | 东京无码熟妇人妻av在线网址 | 国产成人无码av在线影院 | 亚洲一区二区三区在线观看网站 | 无码精品国产va在线观看dvd | 色诱久久久久综合网ywww | 日本熟妇人妻xxxxx人hd | 九一九色国产 | 久久国产精品偷任你爽任你 | 久久久久久九九精品久 | 国产sm调教视频在线观看 | 精品国产成人一区二区三区 | 少妇邻居内射在线 | 日本护士毛茸茸高潮 | 亚洲色欲色欲欲www在线 | 免费无码肉片在线观看 | 欧美丰满少妇xxxx性 | 欧美 丝袜 自拍 制服 另类 | 国产麻豆精品精东影业av网站 | 理论片87福利理论电影 | 国产精品va在线播放 | 久久99精品久久久久久动态图 | 无套内谢的新婚少妇国语播放 | 国产内射老熟女aaaa | 粉嫩少妇内射浓精videos | 国产精品久久久久久久9999 | 亚洲中文字幕无码中文字在线 | 婷婷色婷婷开心五月四房播播 | 无码一区二区三区在线 | 亚洲一区二区三区国产精华液 | 澳门永久av免费网站 | 国产精品高潮呻吟av久久 | 色一情一乱一伦一区二区三欧美 | 久久久久久久久蜜桃 | 激情五月综合色婷婷一区二区 | 男女下面进入的视频免费午夜 | 人妻中文无码久热丝袜 | 在线天堂新版最新版在线8 | 丰满少妇弄高潮了www | 亚洲中文字幕无码一久久区 | 亚洲成a人片在线观看无码3d | 窝窝午夜理论片影院 | 国产精品理论片在线观看 | 小sao货水好多真紧h无码视频 | 两性色午夜视频免费播放 | 成人免费无码大片a毛片 | 国产在线精品一区二区三区直播 | 99精品视频在线观看免费 | 亚洲 另类 在线 欧美 制服 | 熟妇人妻激情偷爽文 | 欧美熟妇另类久久久久久多毛 | 国内少妇偷人精品视频 | 色一情一乱一伦一区二区三欧美 | 激情人妻另类人妻伦 | 久久亚洲中文字幕精品一区 | 特大黑人娇小亚洲女 | 永久免费观看国产裸体美女 | 亚洲一区二区三区 | 国产亚洲精品久久久久久大师 | 久久精品国产99久久6动漫 | 综合网日日天干夜夜久久 | 亚洲人成无码网www | 小sao货水好多真紧h无码视频 | 亚洲日韩中文字幕在线播放 | 国产猛烈高潮尖叫视频免费 | 欧洲欧美人成视频在线 | 98国产精品综合一区二区三区 | 久久五月精品中文字幕 | 久久精品人妻少妇一区二区三区 | 久久99久久99精品中文字幕 | 久在线观看福利视频 | 国产精品资源一区二区 | 人妻熟女一区 | 久久99精品国产麻豆蜜芽 | 少妇久久久久久人妻无码 | 荫蒂被男人添的好舒服爽免费视频 | 精品国产精品久久一区免费式 | 真人与拘做受免费视频 | 狠狠亚洲超碰狼人久久 | 波多野结衣高清一区二区三区 | 久久精品人人做人人综合试看 | 88国产精品欧美一区二区三区 | 国产亚洲精品久久久久久 | 日本大乳高潮视频在线观看 | 亚洲国产精品久久久久久 | 久久无码中文字幕免费影院蜜桃 | 亚洲aⅴ无码成人网站国产app | 一本久道久久综合婷婷五月 | 国产内射爽爽大片视频社区在线 | 亚洲成a人片在线观看无码 | 日欧一片内射va在线影院 | 狠狠cao日日穞夜夜穞av | 亚洲熟女一区二区三区 | 最近中文2019字幕第二页 | 久久 国产 尿 小便 嘘嘘 | 亚洲一区二区观看播放 | 天天躁日日躁狠狠躁免费麻豆 | 美女扒开屁股让男人桶 | 午夜福利电影 | 亚洲精品中文字幕久久久久 | 国产精品第一区揄拍无码 | 亚洲一区二区三区国产精华液 | 久久精品国产99久久6动漫 | 少妇无码一区二区二三区 | 中文字幕人妻丝袜二区 | 最新国产乱人伦偷精品免费网站 | 领导边摸边吃奶边做爽在线观看 | 国内精品一区二区三区不卡 | 亚洲色成人中文字幕网站 | 国产香蕉尹人视频在线 | 久久精品国产亚洲精品 | 亚洲精品国产精品乱码不卡 | 亚洲高清偷拍一区二区三区 | 粉嫩少妇内射浓精videos | 亚洲乱亚洲乱妇50p | 高中生自慰www网站 | 久久久久久亚洲精品a片成人 | 成人免费视频在线观看 | 小泽玛莉亚一区二区视频在线 | 骚片av蜜桃精品一区 | 波多野结衣av一区二区全免费观看 | 欧美日韩一区二区综合 | 亚洲人成网站色7799 | 男人的天堂av网站 | 人人妻人人澡人人爽欧美精品 | 免费男性肉肉影院 | 中文字幕乱码人妻二区三区 | 日韩欧美中文字幕在线三区 | 国产手机在线αⅴ片无码观看 | 国产免费久久久久久无码 | 国产成人无码区免费内射一片色欲 | 国产九九九九九九九a片 | 樱花草在线播放免费中文 | 国产精品久久久一区二区三区 | 国产免费无码一区二区视频 | 一本加勒比波多野结衣 | 久久精品99久久香蕉国产色戒 | 少妇性l交大片欧洲热妇乱xxx | 野狼第一精品社区 | 久久精品国产99久久6动漫 | 国产亲子乱弄免费视频 | 欧美精品国产综合久久 | 未满小14洗澡无码视频网站 | 亚洲欧美中文字幕5发布 | 青青草原综合久久大伊人精品 | 亚洲国产精品无码久久久久高潮 | 最近中文2019字幕第二页 | 3d动漫精品啪啪一区二区中 | 婷婷丁香五月天综合东京热 | 男女爱爱好爽视频免费看 | 131美女爱做视频 | 免费乱码人妻系列无码专区 | 成年美女黄网站色大免费全看 | www国产精品内射老师 | 人人爽人人澡人人人妻 | 又大又黄又粗又爽的免费视频 | 又粗又大又硬又长又爽 | 77777熟女视频在线观看 а天堂中文在线官网 | 大肉大捧一进一出视频出来呀 | 中文字幕乱码人妻二区三区 | 欧美黑人乱大交 | 日本一卡2卡3卡四卡精品网站 | 精品国偷自产在线 | 亚洲aⅴ无码成人网站国产app | 亚洲色欲久久久综合网东京热 | 97久久国产亚洲精品超碰热 | 国产日产欧产精品精品app | 日韩精品久久久肉伦网站 | 又粗又大又硬又长又爽 | 久久久久久久久蜜桃 | 日日橹狠狠爱欧美视频 | 国产福利视频一区二区 | 久久亚洲中文字幕精品一区 | 强奷人妻日本中文字幕 | 国产精品久久久久无码av色戒 | 高潮毛片无遮挡高清免费视频 | 日韩av无码一区二区三区不卡 | 欧美一区二区三区视频在线观看 | 成人无码影片精品久久久 | 无套内谢的新婚少妇国语播放 | 国产午夜无码视频在线观看 | 亚洲人成无码网www | 欧美日韩综合一区二区三区 | 色五月丁香五月综合五月 | 精品无码国产一区二区三区av | 色一情一乱一伦一区二区三欧美 | 精品国偷自产在线 | 亚洲国产精品久久人人爱 | 国产成人人人97超碰超爽8 | 高潮毛片无遮挡高清免费视频 | 亚洲一区二区三区香蕉 | 全黄性性激高免费视频 | 亚洲日韩av一区二区三区中文 | 中文久久乱码一区二区 | 午夜丰满少妇性开放视频 | 中文字幕人成乱码熟女app | 精品无码国产自产拍在线观看蜜 | 色综合视频一区二区三区 | 日本饥渴人妻欲求不满 | 97色伦图片97综合影院 | 精品久久久久久亚洲精品 | 久久99精品久久久久婷婷 | 国产一区二区三区精品视频 | 国产午夜无码视频在线观看 | 国产亚洲日韩欧美另类第八页 | 国产高清av在线播放 | 国产精品久久久午夜夜伦鲁鲁 | 久久国产劲爆∧v内射 | 亚洲国产精品一区二区美利坚 | 日韩av无码一区二区三区 | 国产日产欧产精品精品app | 欧美自拍另类欧美综合图片区 | 乌克兰少妇性做爰 | 精品国偷自产在线 | 亚洲色大成网站www国产 | 精品水蜜桃久久久久久久 | 四虎国产精品一区二区 | 久久99精品久久久久久动态图 | 人妻尝试又大又粗久久 | 久久精品99久久香蕉国产色戒 | 青草青草久热国产精品 | 老司机亚洲精品影院 | 一个人免费观看的www视频 | 亚洲精品午夜国产va久久成人 | 黑森林福利视频导航 | 亚洲呦女专区 | 国产激情无码一区二区app | 大色综合色综合网站 | 无码一区二区三区在线观看 | 丰满人妻翻云覆雨呻吟视频 | 亚洲国产精品毛片av不卡在线 | 乌克兰少妇性做爰 | 国产成人无码a区在线观看视频app | 国产精品久久久久久亚洲影视内衣 | 国产精品毛多多水多 | 国产乱人偷精品人妻a片 | 99精品视频在线观看免费 | 亚洲色无码一区二区三区 | 久久婷婷五月综合色国产香蕉 | 久久熟妇人妻午夜寂寞影院 | 国产激情精品一区二区三区 | 色欲久久久天天天综合网精品 | 亚洲 激情 小说 另类 欧美 | 国产精品自产拍在线观看 | 亚洲色欲色欲欲www在线 | 无码任你躁久久久久久久 | 影音先锋中文字幕无码 | 亚无码乱人伦一区二区 | 任你躁国产自任一区二区三区 | 亚洲经典千人经典日产 | 久久 国产 尿 小便 嘘嘘 | 日韩欧美中文字幕公布 | 中文字幕人妻无码一夲道 | 久久精品国产大片免费观看 | 97无码免费人妻超级碰碰夜夜 | 国产av久久久久精东av | 中文字幕人妻无码一区二区三区 | 岛国片人妻三上悠亚 | 亚洲天堂2017无码中文 | 国产午夜无码视频在线观看 | 国产成人综合美国十次 | 久久久精品成人免费观看 | 性欧美大战久久久久久久 | 99久久精品午夜一区二区 | 性欧美牲交在线视频 | 自拍偷自拍亚洲精品10p | 无码毛片视频一区二区本码 | 亚洲人成影院在线观看 | 亚洲一区二区三区偷拍女厕 | 中文字幕无线码免费人妻 | 性生交片免费无码看人 | 亚洲第一无码av无码专区 | 色欲av亚洲一区无码少妇 | 一本色道久久综合亚洲精品不卡 | 日韩av无码一区二区三区不卡 | 亚洲国产精华液网站w | 婷婷五月综合激情中文字幕 | 亚洲精品久久久久avwww潮水 | 麻豆国产人妻欲求不满谁演的 | 夜夜影院未满十八勿进 | 精品欧洲av无码一区二区三区 | 97人妻精品一区二区三区 | 白嫩日本少妇做爰 | 成人免费视频一区二区 | 亚洲男人av香蕉爽爽爽爽 | 性欧美疯狂xxxxbbbb | 中文无码成人免费视频在线观看 | 日韩欧美中文字幕公布 | 好男人www社区 | 国产乱人无码伦av在线a | √天堂资源地址中文在线 | 免费看少妇作爱视频 | 水蜜桃av无码 | www国产亚洲精品久久网站 | 国产激情精品一区二区三区 | 久久久中文久久久无码 | 极品尤物被啪到呻吟喷水 | 亚洲大尺度无码无码专区 | 麻豆蜜桃av蜜臀av色欲av | 麻豆精品国产精华精华液好用吗 | 四虎国产精品一区二区 | 亚洲精品综合一区二区三区在线 | 国产午夜无码视频在线观看 | 两性色午夜视频免费播放 | 岛国片人妻三上悠亚 | 无人区乱码一区二区三区 | 国产情侣作爱视频免费观看 | 欧洲熟妇精品视频 | 国产精品99久久精品爆乳 | v一区无码内射国产 | 300部国产真实乱 | 强辱丰满人妻hd中文字幕 | 久久精品人人做人人综合 | 最近中文2019字幕第二页 | av人摸人人人澡人人超碰下载 | 免费无码一区二区三区蜜桃大 | 毛片内射-百度 | 欧美日韩一区二区免费视频 | 久久综合激激的五月天 | 高清国产亚洲精品自在久久 | 国产另类ts人妖一区二区 | 国产精品无码一区二区桃花视频 | 色诱久久久久综合网ywww | 亚洲 日韩 欧美 成人 在线观看 | 青春草在线视频免费观看 | 国产成人精品无码播放 | 亚洲小说春色综合另类 | 波多野结衣av在线观看 | 精品一区二区三区无码免费视频 | 久久精品女人的天堂av | 蜜桃av抽搐高潮一区二区 | 鲁鲁鲁爽爽爽在线视频观看 | 亚洲欧洲中文日韩av乱码 | 国语自产偷拍精品视频偷 | 又粗又大又硬又长又爽 | 欧美兽交xxxx×视频 | 亚洲成熟女人毛毛耸耸多 | 亚洲va欧美va天堂v国产综合 | 蜜桃臀无码内射一区二区三区 | 99久久精品无码一区二区毛片 | 67194成是人免费无码 | 久久久精品欧美一区二区免费 | 久久久亚洲欧洲日产国码αv | 最近免费中文字幕中文高清百度 | 国产精品va在线观看无码 | 水蜜桃色314在线观看 | 国产人妻大战黑人第1集 | 一本久久a久久精品vr综合 | 精品久久久久久人妻无码中文字幕 | 亚洲精品鲁一鲁一区二区三区 | 国产suv精品一区二区五 | av在线亚洲欧洲日产一区二区 | 国产真实夫妇视频 | 国产成人综合在线女婷五月99播放 | 亚洲热妇无码av在线播放 | 亚洲乱码国产乱码精品精 | 国产麻豆精品精东影业av网站 | 国产精品-区区久久久狼 | 少妇性荡欲午夜性开放视频剧场 | 蜜桃视频插满18在线观看 |