2009-08-24 22 views
4

我更新了一些代碼,我沒有寫,而部分是一個正則表達式如下:我有兩個問題,其中一個是一個正則表達式

\[url(?:\s*)\]www\.(.*?)\[/url(?:\s*)\] 

我明白,*?在第二個寄存器中進行非貪婪的匹配。

什麼?:\ s *在第一個和第三個寄存器中做什麼?

更新:按照要求,語言是C#.NET的3.5

+2

哦,現在你有3個問題? – 2009-08-24 01:40:30

+1

其中之一是正則表達式 – 2009-08-24 01:59:34

+0

@Guy,\ s是一個perlish正則表達式構造。你能否更新問題標籤來顯示[perl]或[pcre](perl「兼容的」正則表達式),也許是有問題的實際編程語言?謝謝。 ? – pilcrow 2009-08-24 02:54:42

回答

9

語法(?:)是圍繞把一個子表達式括號沒有分別提取字符串的一部分的方式。

作者想要匹配中間的(.*?)部分,並且不希望開頭或結尾的空格阻礙。現在,您可以使用\1$1(或任何適合您的特定語言的方法)來指代域名,而不是字符串開頭的第一個空格塊

+2

右...和(:)最好()時,你並不需要在其他地方(例如指捕獲的子表達式作爲反向引用,或在匹配輸出):它傳達更多的你的意圖,和(至少潛在地)使得處理更有效率。 – harpo 2009-08-24 01:23:45

+3

所以 - '(?:\ S *)'匹配零個或多個空白字符,而不把它變成反向引用 - 這很奇怪,因爲'\ S *'不完全一樣的東西,只是看起來並不混亂;) – gnarf 2009-08-24 01:24:11

+1

@gnarf:'(?:)'在交替時很有用,即。 '(?:foo | bar)'匹配「foo」或「bar」而不捕捉。 – 2009-08-24 03:15:57

4

?:使括號非空,分組。在那個正則表達式中,您只會提取一條包含中間(。*?)表達式的信息$ 1。

1

你可能會發現這個正則表達式備忘單非常有幫助(希望)。我花了很多年試圖學習正則表達式,但沒有運氣。而且一旦我讀到這張表格 - 我立即明白了我以前沒學​​過的東西。

http://krijnhoetmer.nl/stuff/regex/cheat-sheet/

+1

我會對此表示讚賞,但足夠有趣,它實際上並沒有回答OP的問題。 – 2009-08-24 01:18:43

+0

我有99個問題,但正則表達式不再是其中之一。 – jscharf 2009-08-24 01:18:55

+1

它沒有回答*那個問題,而是偶然地回答了下一個問題,我將這麼問+1以便看到未來。 – Guy 2009-08-24 04:47:04

2

是什麼?:\ S *在第一和第三寄存器呢?

它匹配零個或多個空格字符,而不捕獲它們。

正則表達式筆者有意讓在方括號標籤結尾的空白,符合以下所有DNS標籤「WWW」。像這樣:

[url]www.foo.com[/url]  # foo.com 
[url ]www.foo.com[/url ] # same 
[url ]www.foo.com[/url] # same 
[url]www.foo.com[/url ] # same 

注意,正則表達式也匹配:

[url]www.[/url]  # empty string! 

,並不能匹配

[url]stackoverflow.com[/url] # no match, bummer 
+0

感謝您的例子 - 非常感謝+1 – Guy 2009-08-24 04:48:24

相關問題