先說遇到的問題,
const numberregexp =
/\d+/g
;const
isnumber
=(v)
=> numberregexp.
test
(v);
isnumber
('22');
// true
isnumber
('22');
// false
驚呆了,不是同乙個正則嗎?怎麼可能啊?
全域性匹配(g)
上面的問題就是使用了全域性匹配,帶來的影響.如果正規表示式設定了全域性標誌,test()
的執行會改變正規表示式lastindex
屬性。連續的執行test()
方法,後續的執行將會從lastindex
處開始匹配字串,(exec()
同樣改變正則本身的lastindex
屬性值).
lastindex
是用來指定下一次匹配的起始索引
const numberregexp =
/\d+/g
;const
isnumber
=(v)
=> numberregexp.
test
(v);
isnumber
('22');
// true
// but numberregexp.lastindex 2
isnumber
('22');
// false
// 所以後面的匹配從2開始,後面自然就是找不到匹配了就是false
正則的lastindex
只有正規表示式使用了表示全域性檢索的 「g」 標誌時,該屬性才會起作用。此時應用下面的規則:
修飾符i
修飾符i 就是忽略大小寫的修飾符
修飾符m
修飾符m 修飾符 是多行修飾符; 將開始和結束字元(^和$)視為在多行上工作(也就是,分別匹配每一行的開始和結束(由 \n 或 \r 分割),而不只是只匹配整個輸入字串的最開始和最末尾處。
修飾符u
修飾符u 修飾符,將模式視為unicode序列點的序列, 是對utf-16編碼的支援,es5的時候,還不支援utf-16, 對於碼點大於0xffff的unicode字元,不能識別,必須加上u修飾符。
const a =
"?";
/^.$/
.test
(a);
// false/^
.$/u.
test
(a);
// true
/[a-z]
/i.test
('\u212a'
)// false \u212a是非規範的k字元
/[a-z]
/iu.
test
('\u212a'
)// true
修飾符yconst s =
'aaa_aa_a'
;const r1 =
/a+/g
;const r2 =
/a+/y
; r1.
exec
(s)// ["aaa"]
r2.exec
(s)// ["aaa"]
r1.exec
(s)// ["aa"] 剩餘 '_aa_a' r1 只要剩下的匹配到就好了
r2.exec
(s)// null // 必須衝第乙個開始,第乙個是_,所以匹配不上
修飾符s 正規表示式 正規表示式 總結
非負整數 d 正整數 0 9 1 9 0 9 非正整數 d 0 負整數 0 9 1 9 0 9 整數 d 非負浮點數 d d 正浮點數 0 9 0 9 1 9 0 9 0 9 1 9 0 9 0 9 0 9 1 9 0 9 非正浮點數 d d 0 0 負浮點數 正浮點數正則式 英文本串 a za z...
正規表示式 表示式
網域名稱 a za z0 9 a za z0 9 a za z0 9 a za z0 9 interneturl a za z s 或 http w w w 手機號碼 13 0 9 14 5 7 15 0 1 2 3 5 6 7 8 9 18 0 1 2 3 5 6 7 8 9 d 號碼 x x x...
正規表示式注意事項
1.所謂組。您檢查一次,你可以選擇多個比賽結果,每個結果是指一組 eg.import re pattern re.compile r match pattern.match hello wa hahatest world if match print match.group 2 print matc...