2011-06-01 84 views

回答

4

根據表達式,它匹配任何具有6位或4位數的字符串。

但是,由於您使用的是(。*),表達式將匹配任何至少有4位數的字符串。

要匹配具有6個或4位可以使用:

/^\d{4}(\d{2})?$/ 
0

字面上:任何數量的字符,其與準確6個號碼或正好4個號碼結束。

技術上: 的奇怪的事情是,.*將允許與4號或以上的比賽結束任何有任何數量在此之前的數字,所以什麼?

+0

更確切地說:任何數量的字符在**結尾至少有** 4個數字。 – 2011-06-02 11:39:02

2

的EXPR說:

(.*) take any number of arbitrary characters followed by ([0-9]{6}) six numbers 

- 或 -

(.*) take any number of arbitrary characters followed by ([0-9]{4}) four numbers 
0
  1. 這意味着隨後6個或4位數
  2. 你認爲你可以寫這樣的(.*)(\d{4}|\d{6})任何字符但捕獲組會改變
0

相信這意味着匹配任一

的後面是6位數字的任何字符(.*)的任意數([0-9]{6}

或(|

的任何字符的任意數目( .*),接着是4位數字([0-9]{4}

. =任何字符
*指0,1或許多 - 在這種情況下...查找「的Kleene閉包」
[0-9]表示數字0-9
{6}意味着最後一個圖案被重複6次

現在

...

是不是後跟6位數字的字符串也不符合字符串後跟4位數字的模式?如果這會導致問題,您可以在每個模式的末尾添加空白字符或行尾。

我可能已經做出假設你寫等於

((.*)([0-9]{6}))|((.*)([0-9]{4})) 
0

見這意味着什麼其他的答案。

無論是否有更簡潔的寫法,所有方法幾乎都會編譯爲相同的DFA,因此執行方式相同。這種方式至少是清楚的。你無法理解這一點,爲什麼你想要更簡潔?

0

正則表達式對我有意義的唯一方法是如果你試圖從字符串中提取一定數量的連續數字。如果字符串中有多個可能的匹配項,則需要最後一個匹配項。

在第一替代的(.*)開始吃掉整個字符串,但隨後回退足夠遠,使([0-9]{6})捕捉它們的最後六位。如果它一直沒有找到匹配就退到開頭,第一個備選報告失敗。控制然後傳遞到第二個替代方案,它使用相同的技術來嘗試和最後一個匹配四個數字。如果失敗,整體匹配嘗試失敗。

我開始說正則表達式試圖匹配字符串的末尾處的六位或四位數字,因爲這是人們使用該技術的常見原因。但是這要求它像@ Cyber​​nate的正則表達式那樣在最後停留。在你的情況是這樣的:

^(?:(.*)([0-9]{6})|(.*)([0-9]{4}))$ 

開始錨 - ^ - 不要求進行匹配,但只允許每一個替代的匹配嘗試提高效率。一些正則表達式的口味足夠聰明,可以認識到如果(.*)在字符串的開頭不匹配,那麼在第二個位置,第三個位置等嘗試它沒有意義,但是你不能指望它。


編輯:我只是注意到java標記。如果你在Java的matches()方法中使用這個正則表達式,你不需要添加錨;該方法自動錨定兩端的每個匹配。如果您希望你在比賽結束錨,你就必須「墊」更點明星的正則表達式:

(.*)([0-9]{6}).*|(.*)([0-9]{4}).* 
相關問題