JS——正則詳解

文章內(nèi)容摘自阮一峰大大—RegExp對(duì)象,總結(jié)一下方便自己記憶:

1.正則匹配規(guī)則

  • 字面量字符串

    /dog/ 匹配 ‘dog’

  • 元字符:

    點(diǎn)字符(.) 匹配 除回車(\r)、換行(\n) 丘喻、行分隔符(\u2028)和段分隔符(\u2029)以外的所有字符。
    位置字符(^ / $) ^/$ 表示字符串開(kāi)始/結(jié)束的位置
    選擇符(|) 表示或關(guān)系仅颇,即cat|dog表示匹配cat或dog受神。選擇符會(huì)包括它前后的多個(gè)字符,比如/ab|cd/指的是匹配ab或者cd愿卒,而不是指匹配b或者c缚去。如果想修改這個(gè)行為,可以使用圓括號(hào)琼开,即/a(b|c)d/

  • 轉(zhuǎn)義字符

正則表達(dá)式中那些有特殊含義的字符易结,如果要匹配它們本身,就需要在它們前面要加上反斜杠柜候。比如要匹配加號(hào)搞动,就要寫(xiě)成+。
正則模式中渣刷,需要用斜杠轉(zhuǎn)義的鹦肿,一共有12個(gè)字符:^、.辅柴、[箩溃、$瞭吃、(、)涣旨、|歪架、*、+霹陡、?和蚪、{和\。需要特別注意的是烹棉,如果使用RegExp方法生成正則對(duì)象攒霹,轉(zhuǎn)義需要使用兩個(gè)斜杠,因?yàn)樽址畠?nèi)部會(huì)先轉(zhuǎn)義一次浆洗。

  • 特殊字符

\cX 表示Ctrl-[X]催束,其中的X是A-Z之中任一個(gè)英文字母,用來(lái)匹配控制字符辅髓。
[\b] 匹配退格鍵(U+0008)泣崩,不要與\b混淆。
\n 匹配換行鍵洛口。
\r 匹配回車鍵矫付。
\t 匹配制表符tab(U+0009)。
\v 匹配垂直制表符(U+000B)第焰。
\f 匹配換頁(yè)符(U+000C)买优。
\0 匹配null字符(U+0000)。
\xhh 匹配一個(gè)以兩位十六進(jìn)制數(shù)(\x00-\xFF)表示的字符挺举。
\uhhhh 匹配一個(gè)以四位十六進(jìn)制數(shù)(\u0000-\uFFFF)表示的unicode字符杀赢。

  • 字符類

字符類(class)表示有一系列字符可供選擇,只要匹配其中一個(gè)就可以了湘纵。所有可供選擇的字符都放在方括號(hào)內(nèi)脂崔,比如[xyz] 表示x、y梧喷、z之中任選一個(gè)匹配砌左。
(1).脫字符(^)
如果方括號(hào)內(nèi)的第一個(gè)字符是[^],則表示除了字符類之中的字符铺敌,其他字符都可以匹配汇歹。比如,[^xyz]表示除了x偿凭、y产弹、z之外都可以匹配。
如果方括號(hào)內(nèi)沒(méi)有其他字符弯囊,即只有[^]痰哨,就表示匹配一切字符胶果,其中包括換行符,而點(diǎn)號(hào)(.)是不包括換行符的
(2).連字符(-)
某些情況下斤斧,對(duì)于連續(xù)序列的字符稽物,連字符(-)用來(lái)提供簡(jiǎn)寫(xiě)形式,表示字符的連續(xù)范圍折欠。比如,[abc]可以寫(xiě)成[a-c]吼过,[0123456789]可以寫(xiě)成[0-9]锐秦,同理[A-Z]表示26個(gè)大寫(xiě)字母。注意:[1-31]盗忱,不代表1到31酱床,只代表1到3。

  • 預(yù)定義模式

\d 匹配0-9之間的任一數(shù)字趟佃,相當(dāng)于[0-9]扇谣。
\D 匹配所有0-9以外的字符,相當(dāng)于[^0-9]闲昭。
\w 匹配任意的字母罐寨、數(shù)字和下劃線,相當(dāng)于[A-Za-z0-9_]序矩。
\W 除所有字母鸯绿、數(shù)字和下劃線以外的字符,相當(dāng)于[^A-Za-z0-9_]簸淀。
\s 匹配空格(包括制表符瓶蝴、空格符、斷行符等)租幕,相等于[\t\r\n\v\f]舷手。
\S 匹配非空格的字符,相當(dāng)于[^\t\r\n\v\f]劲绪。
\b 匹配詞的邊界男窟。
\B 匹配非詞邊界,即在詞的內(nèi)部珠叔。

  • 重復(fù)類

模式的精確匹配次數(shù)蝎宇,使用大括號(hào)({})表示。{n}表示恰好重復(fù)n次祷安,{n,}表示至少重復(fù)n次姥芥,{n,m}表示重復(fù)不少于n次,不多于m次汇鞭。

  • 量詞類

? 問(wèn)號(hào)表示某個(gè)模式出現(xiàn)0次或1次凉唐,等同于{0, 1}庸追。
* 星號(hào)表示某個(gè)模式出現(xiàn)0次或多次,等同于{0,}台囱。
+ 加號(hào)表示某個(gè)模式出現(xiàn)1次或多次淡溯,等同于{1,}。

  • 貪婪模式

默認(rèn)情況下是最大可能匹配簿训,即匹配直到下一個(gè)字符不滿足匹配規(guī)則為止咱娶。這被稱為貪婪模式。
如果想將貪婪模式改為非貪婪模式强品,可以在量詞符后面加一個(gè)問(wèn)號(hào)膘侮。

//貪婪模式
var s = 'aaa';
s.match(/a+/) // ["aaa"]
//非貪婪模式
var s = 'aaa';
s.match(/a+?/) // ["a"]

*?:表示某個(gè)模式出現(xiàn)0次或多次,匹配時(shí)采用非貪婪模式的榛。
+?:表示某個(gè)模式出現(xiàn)1次或多次琼了,匹配時(shí)采用非貪婪模式。

  • 修飾符

修飾符(modifier)表示模式的附加規(guī)則夫晌,放在正則模式的最尾部雕薪。
修飾符可以單個(gè)使用,也可以多個(gè)一起使用晓淀。

  • g修飾符
    默認(rèn)情況下所袁,第一次匹配成功后,正則對(duì)象就停止向下匹配了凶掰。g修飾符表示全局匹配(global)纲熏,加上它以后,正則對(duì)象將匹配全部符合條件的結(jié)果锄俄,主要用于搜索和替換局劲。
  • i修飾符
    默認(rèn)情況下,正則對(duì)象區(qū)分字母的大小寫(xiě)奶赠,加上i修飾符以后表示忽略大小寫(xiě)(ignorecase)鱼填。
  • m修飾符
    m修飾符表示多行模式(multiline),會(huì)修改^和$的行為毅戈。默認(rèn)情況下(即不加m修飾符時(shí))苹丸,^和$匹配字符串的開(kāi)始處和結(jié)尾處,加上m修飾符以后苇经,^和$還會(huì)匹配行首和行尾赘理,即^和$會(huì)識(shí)別換行符(\n)。
  • 組匹配

正則表達(dá)式的括號(hào)表示分組匹配扇单,括號(hào)中的模式可以用來(lái)匹配分組的內(nèi)容商模。

var m = 'abcabc'.match(/(.)b(.)/);
m
// ['abc', 'a', 'c']

上面代碼中,正則表達(dá)式/(.)b(.)/一共使用兩個(gè)括號(hào),第一個(gè)括號(hào)捕獲a施流,第二個(gè)括號(hào)捕獲c响疚。
注意:使用組匹配時(shí),不宜同時(shí)使用g修飾符瞪醋,否則match方法不會(huì)捕獲分組的內(nèi)容忿晕。

var m = 'abcabc'.match(/(.)b(.)/g);
m
// ['abc', 'abc']

在正則表達(dá)式內(nèi)部,可以用\n引用括號(hào)匹配的內(nèi)容银受,n是從1開(kāi)始的自然數(shù)践盼,表示對(duì)應(yīng)順序的括號(hào)。

/(.)b(.)\1b\2/.test("abcabc") // true
/y(..)(.)\2\1/.test('yabccab') // true

上面的第一行代碼中宾巍,\1表示前一個(gè)括號(hào)匹配的內(nèi)容(即“a”)宏侍,\2表示第二個(gè)括號(hào)匹配的內(nèi)容(即“b”)。

/y((..)\2)\1/.test('yabababab') // true   
括號(hào)還可以嵌套蜀漆,此時(shí)\1指向外層括號(hào),\2指向內(nèi)層括號(hào)咱旱。

非捕獲組:
(?:x)稱為非捕獲組(Non-capturing group)确丢,表示不返回該組匹配的內(nèi)容,即匹配的結(jié)果中不計(jì)入這個(gè)括號(hào)吐限。

var m = 'abc'.match(/(?:.)b(.)/);
m // ["abc", "c"]

上面代碼中的模式鲜侥,一共使用了兩個(gè)括號(hào)。其中第一個(gè)括號(hào)是非捕獲組诸典,所以最后返回的結(jié)果中沒(méi)有第一個(gè)括號(hào)描函,只有第二個(gè)括號(hào)匹配的內(nèi)容。
先行斷言:
x(?=y)稱為先行斷言(Positive look-ahead)狐粱,x只有在y前面才匹配舀寓,y不會(huì)被計(jì)入返回結(jié)果。比如肌蜻,要匹配后面跟著百分號(hào)的數(shù)字互墓,可以寫(xiě)成/\d+(?=%)/。

var m = 'abc'.match(/b(?=c)/);
m // ["b"]

先行否定斷言:
x(?!y)稱為先行否定斷言(Negative look-ahead)蒋搜,x只有不在y前面才匹配篡撵,y不會(huì)被計(jì)入返回結(jié)果。比如豆挽,要匹配后面跟的不是百分號(hào)的數(shù)字育谬,就要寫(xiě)成/\d+(?!%)/。

/\d+(?!\.)/.exec('3.14')
// ["14"]

2.正則表達(dá)式

新建正則表達(dá)式有兩種方法帮哈。
一種是使用字面量膛檀,以斜杠表示開(kāi)始和結(jié)束。
另一種是使用 RegExp 構(gòu)造函數(shù)。

var regex = /xyz/;
var regex = new RegExp('xyz');

上面兩種寫(xiě)法是等價(jià)的宿刮,都新建了一個(gè)內(nèi)容為xyz的正則表達(dá)式對(duì)象互站。它們的主要區(qū)別是,第一種方法在編譯時(shí)新建正則表達(dá)式僵缺,第二種方法在運(yùn)行時(shí)新建正則表達(dá)式胡桃。

正則對(duì)象生成以后,有兩種使用方式:
正則對(duì)象的方法:將字符串作為參數(shù)磕潮,比如regex.test(string)翠胰。
字符串對(duì)象的方法:將正則對(duì)象作為參數(shù),比如string.match(regex)自脯。

  • 正則對(duì)象的屬性

屬性分兩類
一類是修飾符相關(guān)之景,返回一個(gè)布爾值,表示對(duì)應(yīng)的修飾符是否設(shè)置膏潮。

ignoreCase:返回一個(gè)布爾值锻狗,表示是否設(shè)置了i修飾符,該屬性只讀焕参。
global:返回一個(gè)布爾值轻纪,表示是否設(shè)置了g修飾符,該屬性只讀叠纷。
multiline:返回一個(gè)布爾值刻帚,表示是否設(shè)置了m修飾符,該屬性只讀涩嚣。

一類與修飾符無(wú)關(guān)的屬性崇众,主要是下面兩個(gè)。

lastIndex:返回下一次開(kāi)始搜索的位置航厚。該屬性可讀寫(xiě)顷歌,但是只在設(shè)置了g修飾符時(shí)有意義。
source:返回正則表達(dá)式的字符串形式(不包括反斜杠)幔睬,該屬性只讀衙吩。

  • 正則對(duì)象的方法

(1)test
正則對(duì)象的test方法返回一個(gè)布爾值,表示當(dāng)前模式是否能匹配參數(shù)字符
串溪窒。

/cat/.test('cats and dogs') // true

如果正則表達(dá)式帶有g(shù)修飾符坤塞,則每一次test方法都從上一次結(jié)束的位置開(kāi)始向后匹配,還可以通過(guò)正則對(duì)象的lastIndex屬性指定開(kāi)始搜索的位置。
lastIndex屬性只對(duì)同一個(gè)正則表達(dá)式有效

var count = 0;
while (/a/g.test('babaa')) count++;

上面代碼會(huì)導(dǎo)致無(wú)限循環(huán)澈蚌,因?yàn)閣hile循環(huán)的每次匹配條件都是一個(gè)新的正則表達(dá)式摹芙,導(dǎo)致lastIndex屬性總是等于0。

new RegExp('').test('abc')
// true
如果正則模式是一個(gè)空字符串宛瞄,則匹配所有字符串浮禾。
  • exec()

正則對(duì)象的exec方法交胚,可以返回匹配結(jié)果。如果發(fā)現(xiàn)匹配盈电,就返回一個(gè)數(shù)組蝴簇,成員是每一個(gè)匹配成功的子字符串,否則返回null匆帚。

var s = '_x_x';
var r1 = /x/;
var r2 = /y/;

r1.exec(s) // ["x"]
r2.exec(s) // null

如果正則表示式包含圓括號(hào)(即含有“組匹配”)熬词,則返回的數(shù)組會(huì)包括多個(gè)成員。第一個(gè)成員是整個(gè)匹配成功的結(jié)果吸重,后面的成員就是圓括號(hào)對(duì)應(yīng)的匹配成功的組互拾。也就是說(shuō),第二個(gè)成員對(duì)應(yīng)第一個(gè)括號(hào)嚎幸,第三個(gè)成員對(duì)應(yīng)第二個(gè)括號(hào)颜矿,以此類推。整個(gè)數(shù)組的length屬性等于組匹配的數(shù)量再加1嫉晶。

exec方法的返回?cái)?shù)組還包含以下兩個(gè)屬性:
input:整個(gè)原字符串骑疆。
index:整個(gè)模式匹配成功的開(kāi)始位置(從0開(kāi)始計(jì)數(shù))。

如果正則表達(dá)式加上g修飾符替废,則可以使用多次exec方法箍铭,下一次搜索的位置從上一次匹配成功結(jié)束的位置開(kāi)始。

var r = /a(b+)a/g;

var a1 = r.exec('_abbba_aba_');
a1 // ['abbba', 'bbb']
a1.index // 1
r.lastIndex // 6

var a2 = r.exec('_abbba_aba_');
a2 // ['aba', 'b']
a2.index // 7
r.lastIndex // 10

var a3 = r.exec('_abbba_aba_');
a3 // null
a3.index // TypeError: Cannot read property 'index' of null
r.lastIndex // 0

var a4 = r.exec('_abbba_aba_');
a4 // ['abbba', 'bbb']
a4.index // 1
r.lastIndex // 6

當(dāng)?shù)谌纹ヅ浣Y(jié)束以后舶担,整個(gè)字符串已經(jīng)到達(dá)尾部,正則對(duì)象的lastIndex屬性重置為0彬呻,意味著第四次匹配將從頭開(kāi)始衣陶。
利用g修飾符允許多次匹配的特點(diǎn),可以用一個(gè)循環(huán)完成全部匹配闸氮。

var r = /a(b+)a/g;
var s = '_abbba_aba_';

while(true) {
  var match = r.exec(s);
  if (!match) break;
  console.log(match[1]);
}
// bbb
// b

如果正則對(duì)象是一個(gè)空字符串剪况,則exec方法會(huì)匹配成功,但返回的也是空字符串蒲跨。

3.字符串對(duì)象的方法

match():返回一個(gè)數(shù)組译断,成員是所有匹配的子字符串。
search():按照給定的正則表達(dá)式進(jìn)行搜索或悲,返回一個(gè)整數(shù)孙咪,表示匹配開(kāi)始的位置。
replace():按照給定的正則表達(dá)式進(jìn)行替換巡语,返回替換后的字符串翎蹈。
split():按照給定規(guī)則進(jìn)行字符串分割,返回一個(gè)數(shù)組男公,包含分割后的各個(gè)成員荤堪。

  • String.prototype.match()

字符串的match方法與正則對(duì)象的exec方法非常類似:匹配成功返回一個(gè)數(shù)組,匹配失敗返回null。
如果正則表達(dá)式帶有g(shù)修飾符澄阳,則該方法與正則對(duì)象的exec方法行為不同拥知,會(huì)一次性返回所有匹配成功的結(jié)果。
設(shè)置正則表達(dá)式的lastIndex屬性碎赢,對(duì)match方法無(wú)效低剔,匹配總是從字符串的第一個(gè)字符開(kāi)始。

  • String.prototype.search()

字符串對(duì)象的search方法揩抡,返回第一個(gè)滿足條件的匹配結(jié)果在整個(gè)字符串中的位置户侥。如果沒(méi)有任何匹配,則返回-1峦嗤。
正則表達(dá)式使用g修飾符之后蕊唐,使用lastIndex屬性指定開(kāi)始匹配的位置,結(jié)果無(wú)效烁设,還是從字符串的第一個(gè)字符開(kāi)始匹配替梨。

  • String.prototype.replace()

字符串對(duì)象的replace方法可以替換匹配的值。它接受兩個(gè)參數(shù)装黑,第一個(gè)是搜索模式副瀑,第二個(gè)是替換的內(nèi)容。
搜索模式如果不加g修飾符恋谭,就替換第一個(gè)匹配成功的值糠睡,否則替換所有匹配成功的值。
replace方法的一個(gè)應(yīng)用疚颊,就是消除字符串首尾兩端的空格狈孔。

var str = '  #id div.class  ';
str.replace(/^\s+|\s+$/g, '')
// "#id div.class"

replace方法的第二個(gè)參數(shù)可以使用美元符號(hào)$,用來(lái)指代所替換的內(nèi)容材义。

$& 指代匹配的子字符串均抽。
$` 指代匹配結(jié)果前面的文本。
$' 指代匹配結(jié)果后面的文本其掂。
$n 指代匹配成功的第n組內(nèi)容油挥,n是從1開(kāi)始的自然數(shù)。
$$ 指代美元符號(hào)$款熬。

replace方法的第二個(gè)參數(shù)還可以是一個(gè)函數(shù)深寥,將每一個(gè)匹配內(nèi)容替換為函數(shù)返回值。
作為replace方法第二個(gè)參數(shù)的替換函數(shù)贤牛,可以接受多個(gè)參數(shù)翩迈。第一個(gè)參數(shù)是捕捉到的內(nèi)容,第二個(gè)參數(shù)是捕捉到的組匹配(有多少個(gè)組匹配盔夜,就有多少個(gè)對(duì)應(yīng)的參數(shù))负饲。此外堤魁,最后還可以添加兩個(gè)參數(shù),倒數(shù)第二個(gè)參數(shù)是捕捉到的內(nèi)容在整個(gè)字符串中的位置(比如從第五個(gè)位置開(kāi)始)返十,最后一個(gè)參數(shù)是原字符串妥泉。

  • String.prototype.split()

字符串對(duì)象的split方法按照正則規(guī)則分割字符串,返回一個(gè)由分割后的各個(gè)部分組成的數(shù)組洞坑。
該方法接受兩個(gè)參數(shù)盲链,第一個(gè)參數(shù)是分隔規(guī)則,第二個(gè)參數(shù)是返回?cái)?shù)組的最大成員數(shù)迟杂。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末刽沾,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子排拷,更是在濱河造成了極大的恐慌侧漓,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件监氢,死亡現(xiàn)場(chǎng)離奇詭異布蔗,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)浪腐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門纵揍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人议街,你說(shuō)我怎么就攤上這事泽谨。” “怎么了特漩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,443評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵吧雹,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我拾稳,道長(zhǎng)吮炕,這世上最難降的妖魔是什么腊脱? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,475評(píng)論 1 279
  • 正文 為了忘掉前任访得,我火速辦了婚禮,結(jié)果婚禮上陕凹,老公的妹妹穿的比我還像新娘悍抑。我一直安慰自己,他們只是感情好杜耙,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布搜骡。 她就那樣靜靜地躺著,像睡著了一般佑女。 火紅的嫁衣襯著肌膚如雪记靡。 梳的紋絲不亂的頭發(fā)上谈竿,一...
    開(kāi)封第一講書(shū)人閱讀 49,185評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音摸吠,去河邊找鬼空凸。 笑死,一個(gè)胖子當(dāng)著我的面吹牛寸痢,可吹牛的內(nèi)容都是我干的呀洲。 我是一名探鬼主播,決...
    沈念sama閱讀 38,451評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼啼止,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼道逗!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起献烦,我...
    開(kāi)封第一講書(shū)人閱讀 37,112評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤滓窍,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仿荆,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體贰您,經(jīng)...
    沈念sama閱讀 43,609評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評(píng)論 2 325
  • 正文 我和宋清朗相戀三年拢操,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锦亦。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡令境,死狀恐怖杠园,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情舔庶,我是刑警寧澤抛蚁,帶...
    沈念sama閱讀 33,803評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站惕橙,受9級(jí)特大地震影響瞧甩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜弥鹦,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評(píng)論 3 307
  • 文/蒙蒙 一肚逸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧彬坏,春花似錦朦促、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,357評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至幻赚,卻和暖如春禀忆,著一層夾襖步出監(jiān)牢的瞬間臊旭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,590評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工箩退, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留巍扛,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,636評(píng)論 2 355
  • 正文 我出身青樓乏德,卻偏偏與公主長(zhǎng)得像撤奸,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子喊括,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評(píng)論 2 344

推薦閱讀更多精彩內(nèi)容