2011-11-02 74 views
1

我想要做的就是文字和网址进行这样的字符串:“简单”的正则表达式不工作,我想如何?

这是一个标题[http://awebsite.com/a/download.zip]

这是我使用正则表达式:

/(.*?)[(.*?)]/ 

我知道是什么问题...第一(.*?)是匹配整个字符串!但我不确定如何才能使它匹配到第一个[发生。

解释我做错了什么,以及如何解决将是很好的谢谢你。我最终学习正则表达式!

谢谢你们

PS:使用PHP和preg_match功能。

+0

参见[有像开源世界中的RegexBuddy一样?](http://stackoverflow.c在这个开放源代码世界中)和['/(.*?)[(.*?)]/'visualized](http:/ /是什么意思? /www.strfriend.com/vis?re=%2F%28.*%3F%29%5B%28.*%3F%29%5D%2F) – mario

回答

2

[(.*?)]是一个字符类和匹配之一:'(''.''*',或'?'')'

您需要转义[,使它与文字'['匹配(并且]不是特殊的,因此它不需要转义)。

/(.*?)\[(.*?)]/ 

参见:http://www.regular-expressions.info/charclass.html

+0

感谢您的解释:)有道理。 –

+0

不客气托马斯。 –

2

你几乎得到了它,但尽量逃避分组字符[和],所以你会得到:

/(.*?)\[(.*?)\]/ 
3

你的问题不是第一部分而不是第二部分。

你必须逃离[这样的:

/(.*?)\[(.*?)]/ 

说明:

" 
(  # Match the regular expression below and capture its match into backreference number 1 
    .  # Match any single character 
     *?  # Between zero and unlimited times, as few times as possible, expanding as needed (lazy) 
) 
\[  # Match the character “[” literally 
(  # Match the regular expression below and capture its match into backreference number 2 
    .  # Match any single character 
     *?  # Between zero and unlimited times, as few times as possible, expanding as needed (lazy) 
) 
]  # Match the character “]” literally 
" 
+0

']'不会被转义。 –

+0

@BartKiers:O不知道这一点。我猜是因为它不可能是角色课的结束? – FailedDev

+0

只有当正则表达式引擎在它之前遇到'['''''''''''''''。所以如果没有遇到'['',''''将会匹配'']'''尽管如此,它并没有伤害。 –

1

你需要逃避[]字符:

/(.*?)\[(.*?)\]/ 
+0

'''不需要转义。 –

+0

@BartKiers:是的,你是对的,这是我的习惯。 – Toto

+1

好吧,这不是一个坏习惯。它不会因为逃避而受到伤害,并且有很多人在看到一个非转义的']'时会感到困惑......当我看到一个转义的'''时,我只是感到困惑,因为我认为']'被放置了在一个字符类中,像这样:'[a \] b]',它匹配''a','']'或''b''。 –

相关问题