1

我尝试了以下链接中可能包含空格或连字符的 7-12 位电话号码的解决方案。第一个和最后一个字符必须是数字。

正则表达式匹配 7-12 位数字;可能包含空格或连字符

但是,我不太了解正则表达式。

$phone_pattern="/^\d(?:[-\s]?\d){6,11}$/";

这里的“:”是什么意思?

这个正则表达式如何能够从 6 到 11 个字符中排除连字符和空格?

高度赞赏帮助

4

3 回答 3

4

是的:一部分(?: ... )- 这意味着“非捕获组” - 它对内容进行分组,但不会像正常分组那样创建对它的反向引用(即 $1、$2 等)。

在该正则表达式中,它将匹配 6 到 11 个字符,包括heiphens 和空格 - 这意味着 12-------34 将匹配。我建议使用更严格的模式:

/^\d{7,12}$/

这只会匹配数字。要允许在此匹配中使用 heiphens 和空格,但只获取您想要的数字,您可以像这样使用它:

<?php
$pattern = '/^\d{7,12}$/';
$string = '123-456 789';
$ignoreCharacters = array(' ', '-');

preg_match($pattern, str_replace($ignoreCharacters, $string);
于 2012-10-03T08:19:37.713 回答
3

这是可以理解的如何令人困惑。实际表示“(?: ... )非捕获组”,而不是( ... )“捕获组”。如果您只是针对正则表达式测试字符串,而不是捕获子字符串,那么两者对于您的目的实际上是相同的。

也存在(?= ... ), (?! ... ), (?<= ... ), (?<! ... ), and也无济于事,它们也(?<foo> ... )都意味着不同的东西。

很多东西要学,但肯定有收获!

于 2012-10-03T08:14:14.037 回答
2

您是否尝试过像正则表达式这样的测试引擎(也有其他可用的)我经常使用它来针对表达式测试各种字符串,以确保它们的行为符合预期。

我的理解是,在这种情况下不是单独行动,而是与

? _ 在这种情况下并不意味着前面零次或一次它是修饰符的含义,赋予该组一个新的含义,与修饰符一起使用关闭捕获意味着您希望这是一个非捕获组表达式。

这样做的效果是,当将表达式的一部分放在()中时,默认情况下会导致捕获但?:将其关闭。

因此 (?:[-\s]?\d) 成为非捕获组表达式。

注意捕获的组与反向引用一起使用,大多数正则表达式引擎支持多达 9 个反向引用。

因此,删除捕获加快了匹配过程,并允许您选择不回溯该组,从而为您真正想要回溯的组保存 9 个引用中的一个。

于 2012-10-03T08:56:29.190 回答