Имеется большой код с циклом 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
- Go first to the linenumber given by file
/tmp/lineNumberStartEnvironment
. - 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
- do this with the data content in the body but also with the complete file
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]+?)}/
но это работает только если не появляется дополнительной вложенности выражений
задан 8 окт 2021 в 14:35
0
В общем случае математические и текстовые выражения со сложной скобочной структурой не парсятся регулярками. Так или иначе, без перебора не обойтись.
Если у вас А — это строго то, что находится после run{{
и перед }, которая относится к этой второй скобке: run{{
, то так:
- заводите счетчик
i = 0;
- также инициализируете
resStr = 'run{{';
- начинаете перебор с символа сразу после
run{{
- если символ == «{«, то i++, если == «}», то i—, если символ не скобка — ничего
- на каждом шагу добавляете проверяемый символ в
resStr
- просматриваете строку до тех пор пока счетчик
i не станет == -1
- все.
resStr == 'run{{...}'
Ну и замена run{{...}
на run{{...}delimiter
ответ дан 8 окт 2021 в 15:31
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!
Найти закрывающуюся скобку
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
Member Рейтинг (т): 5 |
Приветствую. Необходимо искать в строке открывающиеся и закрывающиеся скобки. Наткнулся на UnicodeCategory в МСДНе. Можно ли с помощью него искать пару открывающейся кавычке? Спасибо. |
Алексей_Л |
|
Цитата SunDevil @ 07.07.10, 17:02 искать в строке String.IndexOf() |
Лилой |
|
Цитата SunDevil @ 07.07.10, 17:02 Наткнулся на UnicodeCategory в МСДНе. Можно ли с помощью него искать пару открывающейся кавычке? По этому вопросу не знаю, но я в старые добрые времена (еще на С) искал обыкновенным циклом 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 |
|
Full Member Рейтинг (т): 11 |
Цитата Лилой @ 15.07.10, 14:40 int o=-1; int z=-2;
Что за магические начальные значения ? |
hd44780 |
|
Senior Member Рейтинг (т): 25 |
Цитата IL_Agent @ 23.07.10, 07:22 Что за магические начальные значения ?
Кол-во открытых и закрытых скобок. |
int0 |
|
Full Member Рейтинг (т): 28 |
Цитата А вот чего инициализирует -1, а не нулем, действительно непонятно. Да тут много чего не понятно =) С учетом что скобки — это все таки количество открывающих скобок должно быть равно количеству закрывающих, непонятно почему o и z инициализируются разными значениями. |
Лилой |
|
Цитата int0 @ 23.07.10, 12:58 Да тут много чего не понятно =) С учетом что скобки — это все таки количество открывающих скобок должно быть равно количеству закрывающих, непонятно почему o и z инициализируются разными значениями. Потому разными, что в цикле есть строка их сравнения: if(z==o) Но, все же, извините, я протупил с первичным кодом, надо было как-то так: 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 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 ]