正規表示式的注意點

2021-10-24 16:50:34 字數 1865 閱讀 3401

先說遇到的問題,

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

修飾符y
const 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...