Как найти закрывающую скобку

Имеется большой код с циклом foreach. Также много используется if. Не могу визуально найти закрывающую скобку } .
Подскажите для PHPstorm или Sublime горячие клавиши, чтобы найти место закрытия цикла.


  • Вопрос задан

    более трёх лет назад

  • 234 просмотра

One part of /usr/share/X11/xkb/symbols/us starts with xkb_symbols "dvorak" { and ends with the closing curly bracket }; which line-number I want to find.

partial alphanumeric_keys
xkb_symbols "dvorak" {

    name[Group1]= "English (Dvorak)";

    key <TLDE> { [       grave, asciitilde, dead_grave, dead_tilde      ] };

    key <AE01> { [          1,  exclam          ]       };
    key <AE02> { [          2,  at              ]       };
    key <AE03> { [          3,  numbersign      ]       };
    key <AE04> { [          4,  dollar          ]       };
    key <AE05> { [          5,  percent         ]       };
    key <AE06> { [          6,  asciicircum, dead_circumflex, dead_circumflex ] };
    key <AE07> { [          7,  ampersand       ]       };
    key <AE08> { [          8,  asterisk        ]       };
    key <AE09> { [          9,  parenleft,  dead_grave] };
    key <AE10> { [          0,  parenright      ]       };
    key <AE11> { [ bracketleft, braceleft       ]       };
    key <AE12> { [ bracketright, braceright,  dead_tilde] };

    key <AD01> { [  apostrophe, quotedbl, dead_acute, dead_diaeresis    ] };
    key <AD02> { [      comma,  less,   dead_cedilla, dead_caron        ] };
    key <AD03> { [      period, greater, dead_abovedot, periodcentered  ] };
    key <AD04> { [          p,  P               ]       };
    key <AD05> { [          y,  Y               ]       };
    key <AD06> { [          f,  F               ]       };
    key <AD07> { [          g,  G               ]       };
    key <AD08> { [          c,  C               ]       };
    key <AD09> { [          r,  R               ]       };
    key <AD10> { [          l,  L               ]       };
    key <AD11> { [      slash,  question        ]       };
    key <AD12> { [      equal,  plus            ]       };

    key <AC01> { [          a,  A, adiaeresis, Adiaeresis ]     };
    key <AC02> { [          o,  O               ]       };
    key <AC03> { [          e,  E               ]       };
    key <AC04> { [          u,  U               ]       };
    key <AC05> { [          i,  I               ]       };
    key <AC06> { [          d,  D               ]       };
    key <AC07> { [          h,  H               ]       };
    key <AC08> { [          t,  T               ]       };
    key <AC09> { [          n,  N               ]       };
    key <AC10> { [          s,  S               ]       };
    key <AC11> { [      minus,  underscore      ]       };

    key <AB01> { [   semicolon, colon, dead_ogonek, dead_doubleacute ] };
    key <AB02> { [          q,  Q               ]       };
    key <AB03> { [          j,  J               ]       };
    key <AB04> { [          k,  K               ]       };
    key <AB05> { [          x,  X               ]       };
    key <AB06> { [          b,  B               ]       };
    key <AB07> { [          m,  M               ]       };
    key <AB08> { [          w,  W               ]       };
    key <AB09> { [          v,  V               ]       };
    key <AB10> { [          z,  Z               ]       };

    key <BKSL> { [  backslash,  bar             ]       };
};

I can find the start of the environment which returns 192

grep -n 'xkb_symbols "dvorak"' /usr/share/X11/xkb/symbols/us | cut -d ":" -f1 > /tmp/lineNumberStartEnvironment

I do but blank output

# http://unix.stackexchange.com/a/147664/16920
grep -zPo 'pin(ABC) ({([^{}]++|(?1))*})' /usr/share/X11/xkb/symbols/us

Pseudocode

  1. Go first to the linenumber given by file /tmp/lineNumberStartEnvironment.
  2. Find the closing bracket of the thing located at the line of /tmp/lineNumberStartEnvironment.
    • do this with the data content in the body but also with the complete file /usr/share/X11/xkb/symbols/us

Attempt for heredoc until next line [cas, Kusalananda]

I do where I do not know what I should put to the deliminator; -n returns blank too

sed -n -f - /usr/share/X11/xkb/symbols/us <<END_SED | cut -f1
/xkb_symbols "dvorak" {/,/^};/{
        /xkb_symbols "dvorak" {/=
        /^};/=
}
END_SED

but blank output.

Systems: Ubuntu 16.04
Grep: 2.25

Есть текст с выражениями, вида
run{{A} {B}} {{{C}}{D}}{E}
Как я могу гарантировано получить часть run{{A} ? Нужно поставить разделитель между {A} и {B}, при условии что содержимое A может содержать вложенные выражения в скобках A = {{test}{test}} По сути нужно найти Закрывающую скобку конкретного выражения. Я пробовал /\run{(.*)}/ и затем /{([sS]+?)}/ но это работает только если не появляется дополнительной вложенности выражений

Wiktor Stribiżew's user avatar

задан 8 окт 2021 в 14:35

abakan's user avatar

0

В общем случае математические и текстовые выражения со сложной скобочной структурой не парсятся регулярками. Так или иначе, без перебора не обойтись.

Если у вас А — это строго то, что находится после run{{ и перед }, которая относится к этой второй скобке: run{{, то так:

  • заводите счетчик i = 0;
  • также инициализируете resStr = 'run{{';
  • начинаете перебор с символа сразу после run{{
  • если символ == «{«, то i++, если == «}», то i—, если символ не скобка — ничего
  • на каждом шагу добавляете проверяемый символ в resStr
  • просматриваете строку до тех пор пока счетчик i не станет == -1
  • все. resStr == 'run{{...}'

Ну и замена run{{...} на run{{...}delimiter

ответ дан 8 окт 2021 в 15:31

Zombotron's user avatar

ZombotronZombotron

5333 серебряных знака11 бронзовых знаков

Здравствуйте уважаемые пользователи форума pawno-crmp.

Этот минуал подойдет тем, у кого в моде есть незакрытая скобка, и если стандартные способы не помогают найти ее. Если стандартными способами найти незакрытую скобку не получается, то Вы попали по адресу.

Итак, начнем.

Сегодня я столкнулся с такой проблемой, как незакрытая скобка. Как известно, если в коде имеется незакрытая скобка, то при компилировании компилятор вылетает не показав ошибку. Я перепробовал стандартные способы как найти незакрытую скобку, но они не подходят, так как у меня в коде (ну наверно не только у меня) есть за комментированные скрипты типа таких:

/*
public test()
{
new blablalbla;

*/ 
Дело в том, что программы подсчитывающие количество открытых и закрытых скобок считают за комментированные скобки, поэтому программа выдаст совсем не ту строку которую нужно.

Перейдем к делу.

Чтобы найти незакрытую скобку, я использовал это: (не знаю как назвать)

#error abc 
Если в коде ввести «это», компилятор выдаст ошибку. Опишу поподробнее.

Например незакрытая скобка находится на строке номер 5612. Если ввести #error abc дальше строки 5612, например 6719, то компилятор так же вылетит не выдав никаких ошибок, а если ввести #error abc  до строки 5612 например 3118, то компилятор выдаст ошибку «(3118) : fatal error 111: user error: abc». Думаю теперь вы поняли принцип поиска незакрытой скобки.

Я делал так. С начало ввел  #error abc в середину мода, компилятор выдал ошибку «(3118) : fatal error 111: user error: abc». Далее ниже, и еще ниже. Я делал это до тех пор, пока компилятор не вылетел. И наконец-то я нашел незакрытую скобку.

Удачи Вам в поиске незакрытой скобки! 

Автор минуала я, DimanJeans!

>
Найти закрывающуюся скобку

  • Подписаться на тему
  • Сообщить другу
  • Скачать/распечатать тему



Сообщ.
#1

,
07.07.10, 17:02

    Member

    **

    Рейтинг (т): 5

    Приветствую.

    Необходимо искать в строке открывающиеся и закрывающиеся скобки. Наткнулся на UnicodeCategory в МСДНе. Можно ли с помощью него искать пару открывающейся кавычке?

    Спасибо.


    Алексей_Л



    Сообщ.
    #2

    ,
    08.07.10, 10:17

      Цитата SunDevil @ 07.07.10, 17:02

      искать в строке

      String.IndexOf()


      Лилой



      Сообщ.
      #3

      ,
      15.07.10, 14:40

        Цитата SunDevil @ 07.07.10, 17:02

        Наткнулся на UnicodeCategory в МСДНе. Можно ли с помощью него искать пару открывающейся кавычке?

        По этому вопросу не знаю, но я в старые добрые времена (еще на С) искал обыкновенным циклом :tong:, как то так:

        ExpandedWrap disabled

          int o=-1;

          int z=-2;

          for(int i=1;i<=s.length;++i)

          {

              if(s[i]=='(‘) ++o;

              if(s[i]==’)’) ++z;

              if(z==o)

              {

                  …нашол!…

              }

          }

        Сообщение отредактировано: Лилой — 15.07.10, 14:41


        IL_Agent



        Сообщ.
        #4

        ,
        23.07.10, 07:22

          Full Member

          ***

          Рейтинг (т): 11

          Цитата Лилой @ 15.07.10, 14:40

          ExpandedWrap disabled

            int o=-1; int z=-2;

          Что за магические начальные значения ? :)


          hd44780



          Сообщ.
          #5

          ,
          23.07.10, 12:17

            Senior Member

            ****

            Рейтинг (т): 25

            Цитата IL_Agent @ 23.07.10, 07:22

            Что за магические начальные значения ? :)

            Кол-во открытых и закрытых скобок.
            А вот чего инициализирует -1, а не нулем, действительно непонятно.
            Возможно из-за каких-то дальнейших особенностей алгоритма.


            int0



            Сообщ.
            #6

            ,
            23.07.10, 12:58

              Full Member

              ***

              Рейтинг (т): 28

              Цитата

              А вот чего инициализирует -1, а не нулем, действительно непонятно.

              Да тут много чего не понятно =) С учетом что скобки — это все таки количество открывающих скобок должно быть равно количеству закрывающих, непонятно почему o и z инициализируются разными значениями.


              Лилой



              Сообщ.
              #7

              ,
              23.07.10, 13:27

                Цитата int0 @ 23.07.10, 12:58

                Да тут много чего не понятно =) С учетом что скобки — это все таки количество открывающих скобок должно быть равно количеству закрывающих, непонятно почему o и z инициализируются разными значениями.

                Потому разными, что в цикле есть строка их сравнения:

                ExpandedWrap disabled

                  if(z==o)

                Но, все же, извините, я протупил с первичным кодом, надо было как-то так:

                ExpandedWrap disabled

                  int o=-1;

                  int z=-2;

                  for(int i=1;i<=s.length;++i)

                  {

                      if(s[i]=='(‘) ++o;

                      if(s[i]==’)’) ++z;

                      if((z+1)==o)

                      {

                          …нашол!…

                      }

                  }

                А вобще-то надо сделать так, что-бы o != z перед началом цикла. Я такой «способ» привел, может быть вы другой знаете :)

                Eсли хотите, я пороюсь в старых кодах и приведу вам полный алгоритм (он рекурсивен)

                Добавлено 23.07.10, 14:01
                Не нашел, так что сам заново написал:

                ExpandedWrap disabled

                          public float ParseMath(string formula)

                          {

                              int o = -1;

                              int z = -2;

                              int pos_o = 0;

                              for (int i = 1; i < formula.Length; ++i)

                              {

                                  if (formula[i] == ‘(‘)

                                  {

                                      ++o;

                                      pos_o = i;

                                  }

                                  if (formula[i] == ‘)’) ++z;

                                  if ((z + 1) == o)

                                  {

                                      ParseMath(formula.Substring(pos_o, i — pos_o));

                                  }

                              }

                          }

                Такой алгоритм я использовал для разбиения «по скобкам» но он совершенно не подходит для вычисления. Если тебе нужно именно это, то попробуй
                обратную запись формулы или же алгоритм,
                в основе которого используеться теория деревьев.

                Сообщение отредактировано: Лилой — 23.07.10, 19:34

                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)

                0 пользователей:

                • Предыдущая тема
                • .NET: Общие вопросы
                • Следующая тема

                [ Script execution time: 0,0553 ]   [ 16 queries used ]   [ Generated: 29.05.23, 11:23 GMT ]  

                Понравилась статья? Поделить с друзьями:

                Не пропустите также:

              • Как найти площадь равнобедренного треугольника решение
              • Как найти утечку теплого пола водяного
              • Как найти плейлист в телефоне самсунг а51
              • Слишком жидкие сырники как исправить
              • Скрыл чат в вайбере как его найти

              • 0 0 голоса
                Рейтинг статьи
                Подписаться
                Уведомить о
                guest

                0 комментариев
                Старые
                Новые Популярные
                Межтекстовые Отзывы
                Посмотреть все комментарии