2009-08-24 44 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

相关问题