精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

如何實現Lua中關于捕獲機制操作

移動開發 iOS
捕獲值的第三個應用是用在函數gsub中。與其他模式一樣,gsub的替換串可以包含 '%d',當替換發生時他被轉換為對應的捕獲值。

如何實現Lua中關于捕獲機制操作是本文要介紹的內容,捕獲是這樣一種機制:可以使用模式串的一部分匹配目標串的一部分。將你想捕獲的模式用圓括號括起來,就指定了一個捕獲

在string.find使用捕獲的時候,函數會返回捕獲的值作為額外的結果。這常被用來將一個目標串拆分成多個:

  1. pair = "name = Anna" 
  2. _, _, key, value = string.find(pair, "(%a+)%s*=%s*(%a+)")  
  3. print(key, value)    --> name  Anna 

'%a+' 表示菲空的字母序列;'%s*' 表示0個或多個空白。在上面的例子中,整個模式代表:一個字母序列,后面是任意多個空白,然后是 '=' 再后面是任意多個空白,然后是一個字母序列。兩個字母序列都是使用圓括號括起來的子模式,當他們被匹配的時候,他們就會被捕獲。當匹配發生的時候,find函數總是先返回匹配串的索引下標(上面例子中我們存儲啞元變量 _ 中),然后返回子模式匹配的捕獲部分。下面的例子情況類似:

  1. date = "17/7/1990" 
  2. _, _, d, m, y = string.find(date, "(%d+)/(%d+)/(%d+)")  
  3. print(d, m, y)      --> 17 7 1990    

 我們可以在模式中使用向前引用,'%d'(d代表1-9的數字)表示第d個捕獲的拷貝。

看個例子,假定你想查找一個字符串中單引號或者雙引號引起來的子串,你可能使用模式 '["'].-["']',但是這個模式對處理類似字符串 "it's all right" 會出問題。為了解決這個問題,可以使用向前引用,使用捕獲的第一個引號來表示第二個引號:

  1. s = [[then he said: "it's all right"!]]  
  2. a, b, c, quotedPart = string.find(s, "(["'])(.-)%1")  
  3. print(quotedPart)    --> it's all right  
  4. print(c)            --> "   

第一個捕獲是引號字符本身,第二個捕獲是引號中間的內容('.-' 匹配引號中間的子串)。

捕獲值的第三個應用是用在函數gsub中。與其他模式一樣,gsub的替換串可以包含 '%d',當替換發生時他被轉換為對應的捕獲值。(順便說一下,由于存在這些情況,替換串中的字符 '%' 必須用 "%%" 表示)。下面例子中,對一個字符串中的每一個字母進行復制,并用連字符將復制的字母和原字母連接起來:

  1. print(string.gsub("hello Lua!", "(%a)", "%1-%1"))  
  2.     --> h-he-el-ll-lo-o L-Lu-ua-a!   

下面代碼互換相鄰的字符:

  1. print(string.gsub("hello Lua", "(.)(.)", "%2%1"))  
  2.     --> ehll ouLa   

讓我們看一個更有用的例子,寫一個格式轉換器:從命令行獲取LaTeX風格的字符串,形如:

  1. \command{some text} 

將它們轉換為XML風格的字符串:

  1. <command>some text</command> 

對于這種情況,下面的代碼可以實現這個功能:

  1. s = string.gsub(s, "\\(%a+){(.-)}", "<%1>%2</%1>")   

比如,如果字符串s為:

  1. the \quote{task} is to \em{change} that. 

調用gsub之后,轉換為:

  1. the <quote>task</quote> is to change that. 

另一個有用的例子是去除字符串首尾的空格: 

  1. function trim (s)  
  2.     return (string.gsub(s, "^%s*(.-)%s*$", "%1"))  
  3. end   

注意模式串的用法,兩個定位符('^' 和 '$')保證我們獲取的是整個字符串。因為,兩個 '%s*' 匹配首尾的所有空格,'.-' 匹配剩余部分。還有一點需要注意的是gsub返回兩個值,我們使用額外的圓括號丟棄多余的結果(替換發生的次數)。

最后一個捕獲值應用之處可能是功能最強大的。我們可以使用一個函數作為string.gsub的第三個參數調用gsub。在這種情況下,string.gsub每次發現一個匹配的時候就會調用給定的作為參數的函數,捕獲值可以作為被調用的這個函數的參數,而這個函數的返回值作為gsub的替換串。先看一個簡單的例子,下面的代碼將一個字符串中全局變量$varname出現的地方替換為變量varname的值:

  1. function expand (s)  
  2.     s = string.gsub(s, "$(%w+)", function (n)  
  3.       return _G[n]  
  4.     end)  
  5.     return s  
  6. end  
  7.  
  8. name = "Lua"status = "great" 
  9. print(expand("$name is $status, isn't it?"))  
  10. --> Lua is great, isn't it? 

如果你不能確定給定的變量是否為string類型,可以使用tostring進行轉換:

  1. function expand (s)  
  2.     return (string.gsub(s, "$(%w+)", function (n)  
  3.       return tostring(_G[n])  
  4.     end))  
  5. end  
  6. print(expand("print = $print; a = $a"))  
  7. --> print = function: 0x8050ce0; a = nil 

下面是一個稍微復雜點的例子,使用loadstring來計算一段文本內$后面跟著一對方括號內表達式的值:

  1. s = "sin(3) = $[math.sin(3)]; 2^5 = $[2^5]" 
  2. print((string.gsub(s, "$(%b[])", function (x)  
  3.     x = "return " .. string.sub(x, 2, -2)  
  4.     local f = loadstring(x)  
  5.     return f()  
  6. end)))  
  7.  
  8. --> sin(3) = 0.1411200080598672; 2^5 = 32 

第一次匹配是 "$[math.sin(3)]",對應的捕獲為 "[math.sin(3)]",調用string.sub去掉首尾的方括號,所以被加載執行的字符串是 "return math.sin(3)","$[2^5]" 的匹配情況類似。

我們常常需要使用string.gsub遍歷字符串,而對返回結果不感興趣。比如,我們收集一個字符串中所有的單詞,然后插入到一個表中:

  1. words = {}  
  2. string.gsub(s, "(%a+)", function (w)  
  3.     table.insert(words, w)  
  4. end) 

如果字符串s為 "hello hi, again!",上面代碼的結果將是:

  1. {"hello", "hi", "again"} 

使用string.gfind函數可以簡化上面的代碼:

  1. words = {}  
  2. for w in string.gfind(s, "(%a)") do  
  3.     table.insert(words, w)  
  4. end 

gfind函數比較適合用于范性for循環。他可以遍歷一個字符串內所有匹配模式的子串。我們可以進一步的簡化上面的代碼,調用gfind函數的時候,如果不顯示的指定捕獲,函數將捕獲整個匹配模式。所以,上面代碼可以簡化為:

  1. words = {}  
  2. for w in string.gfind(s, "%a") do  
  3.     table.insert(words, w)  
  4. end 

下面的例子我們使用URL編碼,URL編碼是HTTP協議來用發送URL中的參數進行的編碼。這種編碼將一些特殊字符(比如 '='、'&'、'+')轉換為 "%XX" 形式的編碼,其中XX是字符的16進制表示,然后將空白轉換成 '+'。比如,將字符串 "a+b = c" 編碼為 "a%2Bb+%3D+c"。最后,將參數名和參數值之間加一個 '=';在name=value對之間加一個 "&"。比如字符串:

  1. name = "al"query = "a+b = c";  q="yes or no" 

被編碼為:

  1. name=al&query=a%2Bb+%3D+c&q=yes+or+no 

現在,假如我們想將這URL解碼并把每個值存儲到表中,下標為對應的名字。下面的函數實現了解碼功能:

  1. function unescape (s)  
  2.     s = string.gsub(s, "+", " ")  
  3.     s = string.gsub(s, "%%(%x%x)", function (h)  
  4.       return string.char(tonumber(h, 16))  
  5.     end)  
  6.     return s  
  7. end 

第一個語句將 '+' 轉換成空白,第二個gsub匹配所有的 '%' 后跟兩個數字的16進制數,然后調用一個匿名函數,匿名函數將16進制數轉換成一個數字(tonumber在16進制情況下使用的)然后再轉化為對應的字符。比如:

  1. print(unescape("a%2Bb+%3D+c"))    --> a+b = c 

對于name=value對,我們使用gfind解碼,因為names和values都不能包含 '&' 和 '='我們可以用模式 '[^&=]+' 匹配他們:

  1. cgi = {}  
  2. function decode (s)  
  3.     for name, value in string.gfind(s, "([^&=]+)=([^&=]+)") do  
  4.       name = unescape(name)  
  5.       value = unescape(value)  
  6.       cgi[name] = value  
  7.     end  
  8. end 

調用gfind函數匹配所有的name=value對,對于每一個name=value對,迭代子將其相對應的捕獲的值返回給變量name和value。循環體內調用unescape函數解碼name和value部分,并將其存儲到cgi表中。

與解碼對應的編碼也很容易實現。首先,我們寫一個escape函數,這個函數將所有的特殊字符轉換成 '%' 后跟字符對應的ASCII碼轉換成兩位的16進制數字(不足兩位,前面補0),然后將空白轉換為 '+':

  1. function escape (s)  
  2.     s = string.gsub(s, "([&=+%c])", function (c)  
  3.       return string.format("%%%02X", string.byte(c))  
  4.     end)  
  5.     s = string.gsub(s, " ", "+")  
  6.     return s  
  7. end 

編碼函數遍歷要被編碼的表,構造最終的結果串:

  1. function encode (t)  
  2.     local s = "" 
  3.     for k,v in pairs(t) do  
  4.       ss = s .. "&" .. escape(k) .. "=" .. escape(v)  
  5.     end  
  6.     return string.sub(s, 2)    -- remove first `&'  
  7. end  
  8. t = {name = "al"query = "a+b = c"q="yes or no"}  
  9. print(encode(t)) --> q=yes+or+no&query=a%2Bb+%3D+c&name=al 

轉換的技巧(Tricks of the Trade)

模式匹配對于字符串操縱來說是強大的工具,你可能只需要簡單的調用string.gsub和find就可以完成復雜的操作,然而,因為它功能強大你必須謹慎的使用它,否則會帶來意想不到的結果。

對正常的解析器而言,模式匹配不是一個替代品。對于一個quick-and-dirty程序,你可以在源代碼上進行一些有用的操作,但很難完成一個高質量的產品。前面提到的匹配C程序中注釋的模式是個很好的例子:'/%*.-%*/'。如果你的程序有一個字符串包含了"/*",最終你將得到錯誤的結果:

  1. test = [[char s[] = "a /* here"; /* a tricky string */]]  
  2. print(string.gsub(test, "/%*.-%*/", "<COMMENT>"))  
  3.     --> char s[] = "a <COMMENT> 

雖然這樣內容的字符串很罕見,如果是你自己使用的話上面的模式可能還湊活。但你不能將一個帶有這種毛病的程序作為產品出售。

一般情況下,Lua中的模式匹配效率是不錯的:一個奔騰333MHz機器在一個有200K字符的文本內匹配所有的單詞(30K的單詞)只需要1/10秒。但是你不能掉以輕心,應該一直對不同的情況特殊對待,盡可能的更明確的模式描述。一個限制寬松的模式比限制嚴格的模式可能慢很多。

一個極端的例子是模式 '(.-)%$' 用來獲取一個字符串內$符號以前所有的字符,如果目標串中存在$符號,沒有什么問題;但是如果目標串中不存在$符號。上面的算法會首先從目標串的第一個字符開始進行匹配,遍歷整個字符串之后沒有找到$符號,然后從目標串的第二個字符開始進行匹配,……這將花費原來平方次冪的時間,導致在一個奔騰333MHz的機器中需要3個多小時來處理一個200K的文本串。可以使用下面這個模式避免上面的問題 '^(.-)%$'。定位符^告訴算法如果在第一個位置沒有沒找到匹配的子串就停止查找。使用這個定位符之后,同樣的環境也只需要不到1/10秒的時間。

也需要小心空模式:匹配空串的模式。比如,如果你打算用模式 '%a*' 匹配名字,你會發現到處都是名字:

  1. i, j = string.find(";$% **#$hello13", "%a*")  
  2. print(i,j)    --> 1 0 

這個例子中調用string.find正確的在目標串的開始處匹配了空字符。永遠不要寫一個以 '-' 開頭或者結尾的模式,因為它將匹配空串。這個修飾符得周圍總是需要一些東西來定位他的擴展。相似的,一個包含 '.*' 的模式是一個需要注意的,因為這個結構可能會比你預算的擴展的要多。

有時候,使用Lua本身構造模式是很有用的。看一個例子,我們查找一個文本中行字符大于70個的行,也就是匹配一個非換行符之前有70個字符的行。我們使用字符類'[^\n]'表示非換行符的字符。所以,我們可以使用這樣一個模式來滿足我們的需要:重復匹配單個字符的模式70次,后面跟著一個匹配一個字符0次或多次的模式。我們不手工來寫這個最終的模式,而使用函數string.rep:

  1. pattern = string.rep("[^\n]", 70) .. "[^\n]*" 

另一個例子,假如你想進行一個大小寫無關的查找。方法之一是將任何一個字符x變為字符類 '[xX]'。我們也可以使用一個函數進行自動轉換:

  1. function nocase (s)  
  2.     s = string.gsub(s, "%a", function (c)  
  3.       return string.format("[%s%s]", string.lower(c),  
  4.                                           string.upper(c))  
  5.     end)  
  6.     return s  
  7. end  
  8.  
  9. print(nocase("Hi there!"))  
  10.     --> [hH][iI] [tT][hH][eE][rR][eE]! 

有時候你可能想要將字符串s1轉化為s2,而不關心其中的特殊字符。如果字符串s1和s2都是字符串序列,你可以給其中的特殊字符加上轉義字符來實現。但是如果這些字符串是變量呢,你可以使用gsub來完成這種轉義:

  1. s1 = string.gsub(s1, "(%W)", "%%%1")  
  2. s2 = string.gsub(s2, "%%", "%%%%") 

在查找串中,我們轉義了所有的非字母的字符。在替換串中,我們只轉義了 '%' 。另一個對模式匹配而言有用的技術是在進行真正處理之前,對目標串先進行預處理。一個預處理的簡單例子是,將一段文本內的雙引號內的字符串轉換為大寫,但是要注意雙引號之間可以包含轉義的引號("""):
這是一個典型的字符串例子:

  1. "This is "great"!". 

我們處理這種情況的方法是,預處理文本把有問題的字符序列轉換成其他的格式。比如,我們可以將 """ 編碼為 "\1",但是如果原始的文本中包含 "\1",我們又陷入麻煩之中。一個避免這個問題的簡單的方法是將所有 "\x" 類型的編碼為 "\ddd",其中ddd是字符x的十進制表示:

  1. function code (s)  
  2.     return (string.gsub(s, "\\(.)", function (x)  
  3.       return string.format("\\%03d", string.byte(x))  
  4.     end))  
  5. end 

注意,原始串中的 "\ddd" 也會被編碼,解碼是很容易的:

  1. function decode (s)  
  2.     return (string.gsub(s, "\\(%d%d%d)", function (d)  
  3.       return "\" .. string.char(d)  
  4.     end))  
  5. end 

如果被編碼的串不包含任何轉義符,我們可以簡單的使用 ' ".-" ' 來查找雙引號字符串

  1. s = [[follows a typical string: "This is "great"!".]]  
  2. s = code(s)  
  3. s = string.gsub(s, '(".-")', string.upper)  
  4. s = decode(s)  
  5. print(s)  
  6.     --> follows a typical string: "THIS IS "GREAT"!". 

更緊縮的形式:

  1. print(decode(string.gsub(code(s), '(".-")', string.upper))) 

我們回到前面的一個例子,轉換\command{string}這種格式的命令為XML風格:

  1. <command>string</command> 

但是這一次我們原始的格式中可以包含反斜杠作為轉義符,這樣就可以使用"\"、"\{" 和 "\}",分別表示 '\'、'{' 和 '}'。為了避免命令和轉義的字符混合在一起,我們應該首先將原始串中的這些特殊序列重新編碼,然而,與上面的一個例子不同的是,我們不能轉義所有的 \x,因為這樣會將我們的命令(\command)也轉換掉。這里,我們僅當x不是字符的時候才對 \x 進行編碼:

  1. function code (s)  
  2.     return (string.gsub(s, '\\(%A)', function (x)  
  3.       return string.format(" \\%03d ", string.byte(x))  
  4.     end))  
  5. end 

解碼部分和上面那個例子類似,但是在最終的字符串中不包含反斜杠,所以我們可直接調用string.char:

  1. function decode (s)  
  2.     return (string.gsub(s, '\\(%d%d%d)', string.char))  
  3. end  
  4.  
  5. s = [[a \emph{command} is written as \\ command\{text\}.]]  
  6. s = code(s)  
  7. s = string.gsub(s, "\\ (%a+){(.-)}", "<%1>%2</%1>")  
  8.  
  9. print(decode(s))  
  10. --> a <emph>command</emph> is written as \command{text}. 

我們最后一個例子是處理CSV(逗號分割)的文件,很多程序都使用這種格式的文本,比如Microsoft Excel。CSV文件十多條記錄的列表,每一條記錄一行,一行內值與值之間逗號分割,如果一個值內也包含逗號這個值必須用雙引號引起來,如果值內還包含雙引號,需使用雙引號轉義雙引號(就是兩個雙引號表示一個),看例子,下面的數組:

{'a b', 'a,b', 'a,"b"c', 'hello "world"!', }

可以看作為:

  1. a b,"a,b"," a,""b""c", hello "world"!, 

將一個字符串數組轉換為CSV格式的文件是非常容易的。我們要做的只是使用逗號將所有的字符串連接起來:

  1. function toCSV (t)  
  2.     local s = "" 
  3.     for _,p in pairs(t) do  
  4.       ss = s .. "," .. escapeCSV(p)  
  5.     end  
  6.     return string.sub(s, 2)    -- remove first comma  
  7. end 

如果一個字符串包含逗號活著引號在里面,我們需要使用引號將這個字符串引起來,并轉義原始的引號:

  1. function escapeCSV (s)  
  2.     if string.find(s, '[,"]') then  
  3.       s = '"' .. string.gsub(s, '"', '""') .. '"'  
  4.     end  
  5.     return s  
  6. end 

將CSV文件內容存放到一個數組中稍微有點難度,因為我們必須區分出位于引號中間的逗號和分割域的逗號。我們可以設法轉義位于引號中間的逗號,然而并不是所有的引號都是作為引號存在,只有在逗號之后的引號才是一對引號的開始的那一個。只有不在引號中間的逗號才是真正的逗號。這里面有太多的細節需要注意,比如,兩個引號可能表示單個引號,可能表示兩個引號,還有可能表示空:

  1. "hello""hello", "","" 

這個例子中,第一個域是字符串 "hello"hello",第二個域是字符串 " """(也就是一個空白加兩個引號),最后一個域是一個空串。

我們可以多次調用gsub來處理這些情況,但是對于這個任務使用傳統的循環(在每個域上循環)來處理更有效。循環體的主要任務是查找下一個逗號;并將域的內容存放到一個表中。對于每一個域,我們循環查找封閉的引號。循環內使用模式 ' "("?) ' 來查找一個域的封閉的引號:如果一個引號后跟著一個引號,第二個引號將被捕獲并賦給一個變量c,意味著這仍然不是一個封閉的引號

  1. function fromCSV (s)  
  2.     ss = s .. ','      -- ending comma  
  3.     local t = {}      -- table to collect fields  
  4.     local fieldstart = 1 
  5.     repeat  
  6.       -- next field is quoted? (start with `"'?)  
  7.       if string.find(s, '^"', fieldstart) then  
  8.       local a, c  
  9.       local i = fieldstart 
  10.       repeat  
  11.           -- find closing quote  
  12.           a, i, c = string.find(s, '"("?)', i+1)  
  13.       until c ~= '"'    -- quote not followed by quote?  
  14.       if not i then error('unmatched "') end  
  15.           local f = string.sub(s, fieldstart+1, i-1)  
  16.           table.insert(t, (string.gsub(f, '""', '"')))  
  17.           fieldstart = string.find(s, ',', i) + 1  
  18.       else              -- unquoted; find next comma  
  19.           local nexti = string.find(s, ',', fieldstart)  
  20.           table.insert(t, string.sub(s, fieldstart,  
  21.                                               nexti-1))  
  22.           fieldstart = nexti + 1  
  23.       end  
  24.     until fieldstart > string.len(s)  
  25.     return t  
  26. end  
  27.  
  28. t = fromCSV('"hello "" hello", "",""')  
  29. for i, s in ipairs(t) do print(i, s) end  
  30.     --> 1      hello " hello  
  31.     --> 2        ""  
  32.     --> 3 

小結:如何實現Lua中關于捕獲機制操作的內容介紹完了,希望通過本文的學習能對你有所幫助!

責任編輯:zhaolei 來源: 博客園
相關推薦

2011-08-24 16:59:59

LuaModule

2011-08-24 17:09:35

LUA閉包函數

2011-08-23 17:06:03

2011-09-06 17:37:01

LUA應用

2011-08-23 16:14:27

Lua函數庫函數

2011-08-23 17:11:13

Lua事件C#

2011-06-13 10:21:25

QT 信號 槽機制

2011-08-29 15:53:04

Lua位運算

2011-08-23 16:37:05

Lua數學庫

2011-08-23 17:33:08

LuaMetatable

2011-08-31 16:39:06

Lua調試器

2011-08-31 16:47:07

Lua調試器

2011-08-30 09:59:47

Mysql ProxyLUA

2011-08-25 17:01:50

LUA網游游戲

2011-08-23 16:22:45

Lua 4.0函數

2011-08-23 15:02:59

LuaTable

2010-09-08 16:50:11

JavaScriptDOM操作

2011-08-25 10:07:24

Lua 5.0函數編譯器

2011-08-24 15:28:02

Lua編譯器解釋器

2011-08-22 17:13:00

LuaC++函數
點贊
收藏

51CTO技術棧公眾號

亚洲精品欧美二区三区中文字幕| 久久久久国产精品午夜一区| 精品少妇一区二区三区视频免付费| 国产传媒久久久| 污视频网站在线播放| 日韩电影在线观看网站| 欧美成aaa人片免费看| 久久久久国产精品区片区无码| 成人全视频免费观看在线看| 亚洲一区二区三区视频在线播放 | 久久久久久久综合日本| 国产在线999| 国产免费观看av| 亚欧美无遮挡hd高清在线视频| 亚洲精品www久久久久久广东| 性chinese极品按摩| 55av亚洲| 亚洲免费观看视频| 日韩欧美亚洲日产国| 丰满人妻一区二区| 精品在线播放免费| 国产成人aa精品一区在线播放| 乱h高h女3p含苞待放| 国产a久久精品一区二区三区| 欧美一卡二卡在线| 免费黄色一级网站| 一根才成人网| 亚洲h精品动漫在线观看| 亚洲一区二区四区| 免费一级毛片在线观看| 粉嫩av一区二区三区在线播放| 国产精品久久久久久网站| 在线观看 中文字幕| 你懂的亚洲视频| 久久黄色av网站| 无码少妇精品一区二区免费动态| 人体久久天天| 亚洲福利在线看| 亚洲成人av免费观看| 久久爱.com| 欧美在线色视频| 无码人妻丰满熟妇区毛片18 | 日韩**中文字幕毛片| 久青草视频在线播放| 国产对白叫床清晰在线播放| 91麻豆国产在线观看| 国产精品一 二 三| 亚洲精品一级片| 国产69精品久久久久777| 亚洲aⅴ男人的天堂在线观看 | 奇米综合一区二区三区精品视频| 欧美亚洲国产视频小说| 日韩久久久久久久久| 国内精品久久久久久久影视麻豆| 久久最新资源网| 日韩三级在线观看视频| 91精品国产乱码久久久久久久| 中文字幕日韩av| 久久精品国产亚洲AV成人婷婷| 国产麻豆精品久久| 一区二区三区美女xx视频| 亚洲国产无码精品| 欧美精品羞羞答答| 最近2019中文免费高清视频观看www99 | a级片免费视频| 国产福利91精品一区二区三区| 91丨九色丨国产在线| 99热在线只有精品| 不卡高清视频专区| 九九热久久66| 福利在线播放| 亚洲欧洲韩国日本视频| 亚洲区成人777777精品| 欧美色图天堂| 欧美丝袜一区二区| 一区二区三区网址| 高清国产一区二区三区四区五区| 日韩免费电影一区| 久久性爱视频网站| 亚洲性视频大全| 日韩最新在线视频| 国产精久久久久久| 日韩精彩视频在线观看| 91久久嫩草影院一区二区| 精品国产伦一区二区三| 91亚洲精品乱码久久久久久蜜桃 | 天天射—综合中文网| 欧美成人激情视频| 亚洲精品视频在线观看免费视频| 乱人伦精品视频在线观看| 国产精品自产拍高潮在线观看| 国产高清免费在线观看| 99国产精品视频免费观看| 欧洲精品久久| 青草视频在线免费直播 | 欧美国产乱视频| 亚洲欧美精品一区二区三区| 麻豆久久久久久| 国产精品视频免费一区二区三区| 精品久久av| 一区二区三区四区视频精品免费| 日韩手机在线观看视频| 国产亚洲高清在线观看| 日韩精品丝袜在线| 欧美黄色aaa| 日韩1区2区日韩1区2区| 国产精品99久久久久久久| 都市激情在线视频| 亚洲国产精品一区二区www在线| 男女曰b免费视频| 最新国产精品精品视频| 一区二区三区美女xx视频| 日本免费一二三区| 蜜桃av一区二区三区电影| 成人欧美一区二区三区黑人免费| 福利视频在线看| 五月天丁香久久| 一起操在线视频| 妖精视频一区二区三区| 久久国产精品偷| 中国老头性行为xxxx| 不卡视频免费播放| www.一区二区.com| 久久亚洲精品人成综合网| 精品中文字幕久久久久久| 欧美成人免费观看视频| 日本午夜精品视频在线观看| 久久99蜜桃综合影院免费观看| 91在线中文| 欧美日韩一区二区欧美激情| 在线免费观看黄色小视频| 黄色成人av网站| 亚洲一区制服诱惑| 亚乱亚乱亚洲乱妇| 在线看不卡av| 久久精品视频18| 国产午夜精品一区二区三区欧美 | 欧美xxxx日本和非洲| 青青草91久久久久久久久| 欧美最猛黑人xxxx黑人猛叫黄| 欧美一级淫片aaaaaa| 樱花影视一区二区| 美女被艹视频网站| 婷婷亚洲五月| 成人亚洲欧美一区二区三区| av在线资源站| 欧美日韩小视频| 欧美aaa级片| 青娱乐精品视频| 日韩亚洲视频| 精品123区| 伊人精品在线观看| 最近中文字幕在线观看视频| 国产日韩欧美a| 久久精品影视大全| 欧美丝袜丝交足nylons172| 国产精品成人一区二区| yourporn在线观看视频| 欧美在线不卡视频| 国产精品一区二区亚洲| 精品一区二区三区在线观看 | av成人毛片| 久久综合九九| 欧美精选视频一区二区| 色偷偷偷综合中文字幕;dd| 91麻豆精品在线| 国产精品视频麻豆| 亚洲黄色片免费看| 国自产拍偷拍福利精品免费一 | 日本欧美国产在线| 国产有码在线| 91麻豆精品国产91| 九九九免费视频| 成人网男人的天堂| 各处沟厕大尺度偷拍女厕嘘嘘| 一区二区三区韩国免费中文网站| 国产精品99久久99久久久二8| 午夜毛片在线| 日韩精品自拍偷拍| 51国产偷自视频区视频| 欧美激情一区在线观看| 国产精欧美一区二区三区白种人| 午夜视频精品| 免费亚洲一区二区| 香蕉久久久久久| 97涩涩爰在线观看亚洲| 在线观看免费版| 日韩免费高清av| 岛国av中文字幕| 国产精品福利电影一区二区三区四区| 古装做爰无遮挡三级聊斋艳谭| 中文高清一区| 亚洲欧美久久234| 北条麻妃一区二区三区在线观看| 欧美亚洲另类在线| 日韩在线免费电影| 亚洲精品国产电影| 一区二区三区www污污污网站| 亚洲一卡二卡三卡四卡无卡久久| 国产精品毛片一区二区| 国产精品一区一区三区| 男女啪啪网站视频| 亚洲视频免费| 亚洲欧美99| 全球av集中精品导航福利| 91麻豆桃色免费看| 欧美电影免费观看网站| 九九热视频这里只有精品| 清纯唯美亚洲色图| 欧美精品一区男女天堂| 中文字幕自拍偷拍| 懂色aⅴ精品一区二区三区蜜月 | 亚洲成av人**亚洲成av**| 免费看黄色三级| 成人免费三级在线| 善良的小姨在线| 免费在线观看成人| 男女超爽视频免费播放| 亚洲中无吗在线| 日本一区二区三区免费看| 成人爽a毛片| 91免费的视频在线播放| 影音成人av| 欧洲成人免费视频| 国产偷倩在线播放| 久久伊人精品一区二区三区| 成av人电影在线观看| 亚洲激情自拍图| www.激情五月| 欧美二区三区的天堂| 国产三级理论片| 色欧美88888久久久久久影院| 九九热精品在线观看| 中文字幕永久在线不卡| 国产精品国产三级国产专业不 | 黑人精品欧美一区二区蜜桃| 日本一极黄色片| 久久成人亚洲| 91视频 -- 69xx| 在线日韩欧美| 黄色成人在线看| 韩国自拍一区| 久久99久久久久久| 国产一区美女| 国产91在线亚洲| 欧美/亚洲一区| 黄色一级片av| 综合久久精品| 精品人妻人人做人人爽| 91麻豆国产自产在线观看亚洲| 亚洲高清在线播放| 日韩一区电影| 一个色的综合| 91精品成人| av久久久久久| 亚洲成色精品| 播放灌醉水嫩大学生国内精品| 亚洲理论在线| 日本三级免费观看| 玖玖在线精品| 欧美女同在线观看| 国产一区激情在线| 一级全黄裸体片| 99久久精品免费| 中文在线永久免费观看| 91色九色蝌蚪| 亚洲一二三精品| 日韩一区在线免费观看| 青青草激情视频| 亚洲二区在线观看| 欧美一二三区视频| 91久久人澡人人添人人爽欧美| 免费在线不卡av| 56国语精品自产拍在线观看| 草草视频在线播放| 亚洲精品一区二区久| 天堂а√在线资源在线| 久久国产精品偷| 亚洲欧洲高清| 国产欧美va欧美va香蕉在线| 日本伊人久久| 蜜桃传媒视频麻豆一区| 欧美成人milf| 九九爱精品视频| 日韩黄色片在线观看| 中文字幕av一区二区三区人妻少妇 | 在线观看一区二区三区四区| 91视频www| 色偷偷男人天堂| 亚洲成人动漫av| 国产情侣呻吟对白高潮| 精品国产一区二区三区忘忧草| 牛牛热在线视频| 欧美成人亚洲成人| 波多视频一区| 91久久国产综合久久蜜月精品| 先锋影音国产精品| 欧美xxxx吸乳| 肉肉av福利一精品导航| 国产精品一级无码| 日本一区二区综合亚洲| 国产一级中文字幕| 欧美人牲a欧美精品| 日韩在线一区二区三区四区| 中文字幕亚洲欧美日韩2019| 白浆在线视频| 91网站免费看| 成人在线电影在线观看视频| 日本xxxxxxxxxx75| 精品一区二区三区免费播放| 精品人妻少妇嫩草av无码| 依依成人综合视频| 亚洲一级在线播放| 日韩电影中文字幕在线观看| 91精品久久久久久粉嫩| 国产精品极品尤物在线观看| 牛牛视频精品一区二区不卡| 成年丰满熟妇午夜免费视频 | av在线1区2区| 欧美极品欧美精品欧美视频| 日本久久二区| 日本一区二区在线视频观看| 在线视频观看日韩| 欧美熟妇精品一区二区| 亚洲少妇30p| 91麻豆成人精品国产免费网站| 亚洲人成啪啪网站| 国产自产自拍视频在线观看| 国产精品.com| 欧美午夜不卡| 欧美一区二区三区影院| 中文字幕人成不卡一区| 最近中文字幕av| 国产一区二区精品丝袜| 在线天堂资源www在线污| 国产精品一区二区欧美黑人喷潮水| 牛夜精品久久久久久久99黑人| 亚洲妇熟xx妇色黄蜜桃| 中文字幕在线播放不卡一区| 一区二区小视频| 中文字幕日韩视频| 欧美aaa大片视频一二区| 青青草久久网络| 日韩电影在线观看网站| 日韩不卡av在线| 欧美日韩一区国产| 免费网站看v片在线a| 91视频国产一区| 欧美性色综合| 日本久久久久久久久久| 亚洲国产精品视频| 午夜视频免费在线| 欧美中文字幕精品| 国产99亚洲| 日本在线观看免费视频| 国产精品久久久久久福利一牛影视 | 久久bbxx| 亚洲自拍欧美色图| 精品动漫一区| 人妻丰满熟妇aⅴ无码| 色一情一乱一乱一91av| 国产区av在线| 成人写真福利网| 黄色工厂这里只有精品| 2一3sex性hd| 色综合天天天天做夜夜夜夜做| 国产视频三级在线观看播放| 国产免费一区二区三区在线能观看| 999精品色在线播放| aaaaa黄色片| 欧美日韩亚洲一区二区三区| 成人午夜影视| 亚洲free嫩bbb| 99精品热6080yy久久| av男人的天堂av| 91精品国产一区二区三区蜜臀| 91极品在线| 青娱乐一区二区| 国产乱码一区二区三区| 国产成人啪精品午夜在线观看| 亚洲乱码av中文一区二区| 久久久加勒比| 被灌满精子的波多野结衣| 久久色在线观看| 国产精品久久免费| 国内外成人免费激情在线视频| 国产99精品| 佐佐木明希电影| 91国产福利在线| 中文字幕有码在线观看| 热re99久久精品国产99热| 国产乱码字幕精品高清av| 国产精品第5页| 欧美精品在线免费播放| 色棕色天天综合网| 国产精品久久久久野外| 色狠狠综合天天综合综合| av网址在线| 日韩av高清| 99麻豆久久久国产精品免费|