正则表达式匹配嵌套括号内的分号

Regex expression to match semicolons inside nested parentheses

我需要一个 Regex 表达式来匹配嵌套括号内的分号。

例如,在行

for (int i = 3; i <= sqrt(n); i = i + 2) { 

我只需要匹配两个分号后跟 3)

目前我正在使用表达式 /;(?=((?!\(\().)*?\))/

但是当在下面的行中使用上面的表达式时,

int rows = 5; for(int i = 1; i <= rows; ++i){ 

后跟 5 的分号也匹配。

我只需要匹配括号内的分号。

如果有人能向我推荐一个可以克服这两种情况的正则表达式,那将是一个很大的帮助。

Example

您可能会得到 forwhile 的所有匹配项,并在它们之后加上均衡数量的括号,然后仅将匹配项中的分号替换为 preg_replace_callback:

'~\b(?:while|for)\s*(\((?:[^()]++|(?1))*\))~u'

参见regex demo

详情

  • \b - 单词边界
  • (?:while|for) - whilefor
  • \s* - 0+ 个空格
  • (\((?:[^()]++|(?1))*\)) - 第 1 组(其模式将用 (?1) 递归):
    • \( - 一个 ( 字符
    • (?:[^()]++|(?1))* - 除 () 或整个第 1 组模式
    • 之外的任何 1+ 个字符出现 0 次或多次
  • \) - 一个 ) 字符

参见 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) {