关于正则表达式中的(?:)问题

来源:百度知道 编辑:UC知道 时间:2024/05/28 02:50:54
正则表达式中有一个元字符"?:"它可以使括号中匹配的内容不被捕获 我试着用((?:(the)) white (?:(queen)))去匹配the white queen,得到的结果确是the white queen,(我预期应该是" white ")似乎?:没有作用 我试了各种各样的匹配 结果都千奇百怪 难以得到我认为正确的我想要的结果 我想可能是我没有理解?:的用法 请各位高手指导 为了防止没人回答浪费分数 我给的分暂时较低 回答好了我会补更多分的 谢谢
另外有一个问题,可以回答也可以不回答:请求一个正则表达式,比如有abc & bcd & "String" & str & "123",我想得到一个能匹配它的正则表达式,灵活性高一些,如abc可能代表a.tostring(),b(),c("你好"),d_c等形式的变量或函数,&和每个元素之间的空格数可能有0个或多个,&也可以用+代替 ,另外虽然我需要匹配以上的内容,但我只需要获取其中带有""的元素,即其他的要屏蔽掉
这个问题很麻烦,如果能解决,不仅除了主要问题给你加分以外,这个问题另外加100分,谢谢了

第一个问题:
仅用于分组的括号:(?:...)
举个PHP例子
<?php
$test = "the white queen";
preg_match("/((the) white (queen))/", $test, $match);
echo $match[2].$match[3];
?>
运行结果为thequeen

<?php
$test = "the white queen";
preg_match("/((?:the) white (?:queen))/", $test, $match);
echo $match[2].$match[3];
?>
运行结果为空

也就是说,(?:...)是为了把复杂的表达式变得清晰,提高效率,不会将括号中的文本按$1之类的编号而进行反向引用,不知道你能理解么,不是你理解的除了....取....这个意思

想要你那个结果,用/^the(.+)queen$/就好了

----------------------------------------------------
第二个问题:
我理解的意思是匹配所有""中间的内容?如果是需要你说的必须为&或+中间的""中的内容,再修改
<?php
$test = 'abc & bcd & "String" + str + "123"';
preg_match_all("/.*?\"(.*?)\".*?/", $test, $match);
print_r($match[1]);
?>
运行结果
Array
(
[0] => String
[1] => 123