我需要一个正则表达式来匹配嵌套括号内的分号。
例如,在
行中for (int i = 3; i <= sqrt(n); i = i + 2) {
我只需要匹配两个分号,后跟 3 和)
目前,我正在使用表达式/;(?=((?!\(\().)*?\))/
但是在下面的行中使用上面的表达式时,
int rows = 5; for(int i = 1; i <= rows; ++i){
后跟 5 的分号也匹配。
我只需要在方括号内匹配分号。
如果有人可以给我推荐一个可以克服这两种情况的正则表达式,那将是一个很大的帮助。
答案 0 :(得分:1)
您可能会获得for
或while
的所有匹配项,并在其后加上平衡的括号,然后仅将匹配项内的分号替换为preg_replace_callback
:
'~\b(?:while|for)\s*(\((?:[^()]++|(?1))*\))~u'
请参见regex demo。
详细信息
\b
-单词边界(?:while|for)
-while
或for
个单词\s*
-超过0个空格(\((?:[^()]++|(?1))*\))
-第1组(其模式将与(?1)
重复出现):
\(
-一个(
字符(?:[^()]++|(?1))*
-除(
和)
或整个第1组模式以外,出现0个或更多的1个以上字符
\)
-一个)
字符请参见PHP demo:
$s = "for (int i = 3; i <= sqrt(n); i = i + 2) {";
echo preg_replace_callback('~\b(?:while|for)\s*(\((?:[^()]++|(?1))*\))~u', function($m) {
return str_replace(';', ';', $m[0]); },
$s);
输出:
for (int i = 3; i <= sqrt(n); i = i + 2) {