鍍金池/ 問答/Java  HTML/ 為什么以豎線結(jié)尾的正則表達(dá)式永真?

為什么以豎線結(jié)尾的正則表達(dá)式永真?

  1. 昨天升級webpack,升級后編譯一直存在問題,最終定位原因為正則表達(dá)式寫錯導(dǎo)致。但是原因有點蹊蹺。
  2. 正則表示式如下

    var reg=/abc|/
    reg.test('ddd')

    結(jié)果:
    true

  3. clipboard.png
  4. 網(wǎng)上搜了下,沒搜到解釋。 在idea里試了下,| 也是匹配所有. 求知道原因的同學(xué)不吝賜教,最好給出文檔?。?!
回答
編輯回答
蝶戀花

|表示,因此/abc|/,表示匹配abc任意單個或多個字符。正則表達(dá)式

2018年9月20日 07:24
編輯回答
病癮

Empty alternative effectively truncates the regex as this point because it will always find a zero-length match

2017年3月6日 04:18
編輯回答
礙你眼

從測試的結(jié)果來看,如果|前面沒有匹配上的話,以|結(jié)尾僅僅是匹配字符間的位置,僅僅是匹配一個位置,有 n 個字符,就有 n+1 個位置可以匹配,所以空字符串,也可以匹配到一個位置,所以永遠(yuǎn)為真:

clipboard.png

最后在 reg101 上是這么解釋的:

clipboard.png

2018年8月1日 16:38
編輯回答
話寡

你這么寫的意思是匹配abc或什么都不匹配,任何字符串都可以什么都不匹配

2018年8月5日 05:33
編輯回答
擱淺

因為元字符“|”右側(cè)沒有內(nèi)容的情況下,是匹配一個位置,類似于^和$的東西,用于定位的。

正則表達(dá)式元字符“|”右側(cè)為空演示

2018年2月13日 04:49
編輯回答
喵小咪

看了各位答主的回答,我整理了一種解釋如下:

每一個正則表達(dá)式的限定即包含了位置限定也包含了字符限定。只有既滿足位置約束也滿足字符約束的字符串才會評估為true.

比如,

^cat 位置限定為行開頭,字符限定為cat
cat 位置限定為任意位置, 字符限定為cat

所以/abc|/的解釋就是匹配任意位置開始的abc串或者匹配任意位置.

因為任何字符串即使是空串也是有位置信息(開頭,結(jié)尾都算位置信息)的,所以自然任何字符串都可以匹配上了。

不知道這個解釋,大家覺得如何?

2017年5月13日 04:03