在正則表達式中,(\w+)?
和(\w*)
之間有什麼區別嗎? 我不明白是否有一些我失蹤的東西。我已經使用了不同的代碼,但他們似乎做了完全相同的事情。 它基本上是一樣的,對吧?是( w +)?和( w *)一樣嗎?
1
A
回答
7
在他們所匹配的方面,有
(\w+)?
和(\w*)
沒有區別。它們都匹配0次或多次出現\w
。這也可以通過使用Perl的Regexp-Compare模塊運行測試來測試,該模塊產生了預期的結果。在捕獲組而言,有一個很大的區別。在
(\w+)?
的情況下,如果失敗,則捕獲組不被初始化。在(\w*)
的情況下,它將被初始化,但將是空的。因此,在Perl"!"=~/(\w+)?/; print $1;
中將返回一個未定義的$ 1警告,而"!"=~/(\w*)/; print $1;
則爲空字符串。在性能方面,
(\w*)
必須略微中的步驟的數量,所述正則表達式引擎必須做,因此優選的方面更好。這當然取決於引擎。但與(\w*)
相比,發動機將永遠不會執行回溯,與(\w+)?
相比。作爲一個例子,我嘗試在Perl中使用
use re 'debug'
指令,並將兩個正則表達式與空字符串進行比較。您可以比較的步驟爲他們每個人:
""=~/(\w+)?/
Matching REx "(\w+)?" against ""
0 <> <> | 1:CURLYX[0] {0,1}(10)
0 <> <> | 9: WHILEM(0)
whilem: matched 0 out of 0..1
0 <> <> | 3: OPEN1(5)
0 <> <> | 5: PLUS(7)
ALNUM can match 0 times out of 2147483647...
failed...
whilem: failed, trying continuation...
0 <> <> | 10: NOTHING(11)
0 <> <> | 11: END(0)
Match successful!
""=~/(\w*)/
Matching REx "(\w*)" against ""
0 <> <> | 1:OPEN1(3)
0 <> <> | 3:STAR(5)
ALNUM can match 0 times out of 2147483647...
0 <> <> | 5: CLOSE1(7)
0 <> <> | 7: END(0)
Match successful!
PS。如果你不是Perl,我認爲它也可以用RegexBuddy來調試正則表達式(我從來沒有嘗試過,但我聽到很多)。
+0
結論:使用'(\ w *)',而不是'(\ w +)?'! – psxls
2
相關問題
- 1. Email validation expression \ w +([ - +。'] \ w +)* @ \ w +([ - 。] \ w +)* \。\ w +([ - 。] \ w +)*允許空格
- 2. is re.split(「\ W」)= re.split(「\ w」)?
- 3. %w和%W之間有什麼區別
- 4. 與NA(W)和NB(W)在語言
- 5. sqlcmd:reconciling -W和-Y
- 6. JavaScript文件的第一行是var w = w || {};
- 7. 是什麼分裂( 「\\ W」)和分離之間的差值( 「[^ \\ W']」)
- 8. Javascript對象和變量w /同名嗎?
- 9. 自動ctrl-w w到vimrc
- 10. 正則表達式的區別:(\ w +)?和(\ w *)
- 11. 是|| w ||在libsvm中...是一個常量值嗎?
- 12. NSDateFormatter 「W」
- 13. 正則表達式 -/\ w \ b \ w/
- 14. Ruby中的%w {}和%W {}大小寫W數組字面量有什麼區別?
- 15. 在Ruby中,%w(x y z)和%w [x y z]之間有區別嗎?
- 16. 拆分字符串與正則表達式\ w \ w *? \ w +?
- 17. ^[A-Za-z](\ W | \ w)*正則表達式?
- 18. SQLCMD:調和-W和-Y
- 19. 「W」打印出W,「W」打印出$。爲什麼?
- 20. Silverlight MVVM:MainView w/SubViews或MainViewModel w/SubViewModels
- 21. SSO b/w cognos和websphere portal
- 22. 使用Flash和Swing w/Java?
- 23. pthread_create b/w fork和exec
- 24. ember.js W/connectOutlet
- 25. Singleton w/HashMap
- 26. 什麼是b/w invalidate()和postInvalidate()?
- 27. 求解W(n)= W(n/2)+ n log n?
- 28. {w |在w的每個奇數位置是1}
- 29. 這是什麼意思? Z = A(xxx:xxx + w-1,yyy:yyy + w-1,:);
- 30. 爲什麼我用W在OpenGL的透視投影中將W除以W?
[regex:plus sign vs asterisk]可能的重複(http://stackoverflow.com/questions/18364673/regex-plus-sign-vs-asterisk) – PeeHaa