欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

"?:"在正则表达式中什么意思

?: 是 不想被捕获的时候使用 可以提高程序执行速度
比如 ([a-z][0-9])+  
 
这个正则表达式里  (  ) 里面的内容被捕获了, 反向引用的时候可以用上 。
一般正则替换的时候用的多  像UBB代码 

但是 如果写成  (?:[a-z][0-9])+   
跟上面 正则表达式 整体匹配是一样的  就是 不会捕获 ( )里内容了。
也就是不能使用 反向引用

如果还是不太理解, 那就先了解一下 反向引用吧。
 
追问
不理解。能不能详细点。
 
追答
比如 PHP 手册里 有个 正则替换的函数 preg_replace 有的列子

$string = 'April 15, 2003';
$pattern = '/(\w+) (\d+), (\d+)/i';
$replacement = '${1}1,$3';
echo preg_replace($pattern, $replacement, $string); 
// 结果显示  April1,2003

这里就用上了 反响引用   
$replacement  里的 ${1} 代表  (\w+)  ,    $3代表 第2个 (\d+)
这个正则表达式 里 一共有 3个 ()  也就是  可以  用 $1  $2  $3  调用 3个()里的 内容。

也可以使用 \1    \2    \3 来 代替  $1  $2  $3  都是一样的

那接下来 如果把 代码里的 正则表达式 改成下面的

$pattern = '/(?:\w+) (?:\d+), (\d+)/i'; 
那 这里  只有 一个 () 里的 内容 能使用 
带 ?:的 ()里面内容是不会被 捕获的  ,所以 只能使用 $1 代表最后的 (\d+)
 
 

其他回答

?:表示不保存括号里的内容
bitterbeans  | 发布于2011-10-18 23:38
评论 
19 5
(?:X)在正则中表示所匹配的子组X不作为结果输出

正常情况(X)中的X会被作为新增的一个组序号输出,比如(A)(B),A的序号1,B的序号2
如果(?:A)(B),A将没有序号不输出,B的序号为1
来自 https://zhidao.baidu.com/question/331376560.html
普通分类: