正则表达式匹配嵌套括号内的分号
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
您可能会得到 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 组模式 之外的任何 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) {
我需要一个 Regex 表达式来匹配嵌套括号内的分号。
例如,在行
for (int i = 3; i <= sqrt(n); i = i + 2) {
我只需要匹配两个分号后跟 3 和 )
目前我正在使用表达式 /;(?=((?!\(\().)*?\))/
但是当在下面的行中使用上面的表达式时,
int rows = 5; for(int i = 1; i <= rows; ++i){
后跟 5 的分号也匹配。
我只需要匹配括号内的分号。
如果有人能向我推荐一个可以克服这两种情况的正则表达式,那将是一个很大的帮助。
Example
您可能会得到 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 组模式 之外的任何 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) {