[英]How do you read this JavaScript regular expression?
var pattern = /^0+$/;
我的猜測是這樣的:
“看看字符串的開頭和結尾,如果在開頭和結尾有一個或多個零的模式,那么返回該模式。”
我確定這是錯的,因為當我用這個字符串運行表達式時:
var string = "0000009000000";
它出現了null
。
那是什么意思呢? 雖然我在問,JavaScript是什么/如何考慮字符串的開頭,中間和結尾?
更新#1:感謝您的回復! 我想我現在明白了。 我的困惑源於我將字符串可視化為具有開頭,中間和結尾的事實。 像這樣:
[開始] [中間] [end]的
換句話說,對於上面給定的字符串,以下表達式可以正常工作:
/^0+/;
返回“000000”(字符串開頭的一個或多個零的模式)
和
/0+$/
; 返回“000000”(字符串末尾的一個或多個零的模式)
更新#2:我對這一點的所有回復進行了投票,因為它們都很有用,我把答案編成了一個很大的答案:
給出以下JavaScript代碼:
var string = "0000009000000";
var regExp = /^0+$/;
alert(regExp.exec(string));
它的部分內容如下:
“如果^修飾符后面跟着正則表達式中$修飾符的確切字符不是同時位於字符串的第一個位置和字符串的最后位置(即,它們不是字符串中唯一的字符,然后返回null
。否則,返回字符。“
換句話說,假設給定的字符串是六個零“000000”。 這導致匹配,因為完全相同的“0”字符組同時位於字符串的第一個位置( 第1個第2個第3個第 4 個第5個第6個)和最后位置(第1個第2個第 3個第4個第5個第6個 )。
但是,在原始給定字符串中,有六個零,后跟一個九,然后是六個零(“0000009000000”)。 現在,弦的第一個位置(第1,第2,第3,第4,第5,第6)中的六個零不是完全相同的六個零位於弦的最后位置(第8,第9,第10,第11,第12) ,13日)。 因此,返回null
。
它說你的字符串只包含0 ...它必須開始,然后有1或更多0,然后結束。
^ 0 + $
如果你想讓它匹配你的字符串,你希望你的正則表達式如下:
var pattern = /^0+.*0+$/
這將在開頭匹配1個或多個'0',在結尾處匹配1個或多個'0',在中間匹配0個或更多個。
至少為0的模式 ,錨定到一行的開頭( ^ )和結尾( $ ); 換句話說,該字符串由一個或多個零組成。
要匹配由數字0到9組成的字符串,並以至少一個零開始和結束,該模式
/^0+[0-9]+0$/
可以工作,即匹配一個或多個零,然后匹配一個或多個數字0-9,以零結尾。
除非另有說明,否則JavaScript會將整個字符串視為一行,忽略換行符; 要強制它考慮多個單獨的行,請使用m修飾符,例如
/regex/m
回應您的更新 - 您是對的。 正則表達式嘗試匹配的字符串確實有一個開頭,一個中間和一個結尾。
但你知道嗎? 所有字符串都有開頭和結尾。
你的正則表達式說,字符串必須有一個開頭,一個結尾,並且在兩者之間 只有一串零。
不要認為你的000000
在開始時,或者你的900000
在最后。 事實上,忽略了開始和結束的想法。
/0+/
/^0+$/
我們為什么要添加^和$?
因為“沒有別的”沒有正則表達式,所以我們必須指定“字符串的開頭,一些零,字符串的結尾”,這是相同的事情。
順便說一下,你也犯了這個錯誤:
如果在開頭和結尾有一個或多個零的模式,則返回該模式
你的正則表達式不會返回“那個模式”,它只會返回true
。 您需要括號來獲取模式: /^(0+)$/
@CodeCurious,你仍然讓它變得比它需要的更復雜。 正則表達式/^0+$/
僅表示整個字符串由一個或多個零組成。 正則表達式提供了大量混淆的機會,因此無論您在哪里找到它都要接受簡單。
/(^0+|0+$)/
我總是將我的正則表達式用於人類的話語,以確保它是我的意思。
這個:^ 0 + $
將如下所示:“如果從我的字符串的開頭(^)開始,你會發現至少有一個(+)零(0),除了字符串的結尾($)之外別無其他。”
請記住,正則表達式基本上是一堆“If”語句。 首先,它必須是“真實的”,然后它將返回最佳結果。 正則表達式永遠不會返回“有點真實”或“大多數真實”的結果。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.