4

我得到了这个模式(我正在使用 php):

'/\[link\=((https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?)\]/i'

当我搜索此字符串时:http://phpquest.zapto.org/users/register.php

匹配项是(顺序为 0-5):

  1. '[link=http://phpquest.zapto.org/users/register.php]'
  2. 'http://phpquest.zapto.org/users/register.php'
  3. 'http://'
  4. 'phpquest.zapto'
  5. org
  6. ''

当我用这样*+最后一个子模式替换时:

'/\[link\=((https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]+)*\/?)\]/i'

匹配项是(顺序为 0-5):

  1. '[link=http://phpquest.zapto.org/users/register.php]'
  2. 'http://phpquest.zapto.org/users/register.php'
  3. 'http://'
  4. 'phpquest.zapto'
  5. org
  6. '/users/register.php'

如果有人能帮助我理解为什么我会非常感激,谢谢大家,祝你有美好的一天。

4

2 回答 2

3

也许一个更简单的例子是当您将thisthis进行比较时。

涉及的正则表达式是:

(a*)*

(a+)*

测试字符串是aaaaaa.

发生的情况是,在捕获主要组(在我提供的示例中,一系列a's)之后,它尝试匹配更多,但不能。可是等等!它也可以不匹配,因为*意味着 0 次或更多次!

因此,在匹配所有a' 之后,它将匹配并捕获一个 'nothing',并且由于仅存储最后捕获的部分,因此您将 '' 作为捕获组的结果。

(a+)*, 在匹配和捕获之后aaaaaa,它不能再匹配或捕获任何东西(+阻止它不匹配任何东西,而不是*),因此aaaaaa是最后一个匹配项。

于 2013-08-06T16:35:28.317 回答
2

这可以使用以下模式进行简化。

/\[link=(https?:\/\/)(([a-z0-9]+\.?)+)((\/[^\/]+)+)\/?\]/i

正则表达式符号*不是贪婪的,+而是。因此,当+在第二次尝试中使用时,所有路径组件都匹配并且该组被捕获;但是,在第一次尝试中*,由于您仅*使用括号捕获内部组,因此您匹配了 的非贪婪样本*,在这种情况下什么也没有。

于 2013-08-06T16:25:49.073 回答