Выражение регулярного выражения для совпадения с точкой с запятой во вложенных скобках - PullRequest
0 голосов
/ 25 марта 2020

Мне нужно выражение Regex для сопоставления точек с запятой во вложенных скобках.

Например, в строке

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

Мне нужно сопоставить только обе точки с запятой, за которыми следует 3 и )

В настоящее время я делаю это с помощью выражения /;(?=((?!\(\().)*?\))/

Но при использовании вышеуказанного выражения в строке ниже,

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

точка с запятой, за которой следует 5 , также совпадают.

Мне нужно только сопоставлять точки с запятой в скобках.

Было бы очень полезно, если бы кто-нибудь мог предложить мне регулярное выражение, которое может преодолеть обе эти ситуации.

* * Пример тысяча двадцать-шести

1 Ответ

1 голос
/ 26 марта 2020

Вы можете получить все совпадения for или while с последующим сбалансированным количеством скобок после них, а затем заменить точки с запятой только внутри совпадений на preg_replace_callback:

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

См. regex demo .

Подробности

  • \b - граница слова
  • (?:while|for) - while или for слова
  • \s* - 0+ пробелов
  • (\((?:[^()]++|(?1))*\)) - группа 1 (ее шаблон будет повторяться с (?1)):
    • \( - ( char
    • (?:[^()]++|(?1))* - 0 или более вхождений любых 1+ символов кроме ( и ) или всего шаблона группы 1
  • \) - ) символ

См. PHP демо :

$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) {
...