как заменить все [,] на (,) в блокноте ++ с регулярным выражением? так:
abc[1, 2]; => abc(1, 2);
abc[EDGE, 2]; => abc(EDGE, 2);
abc[EDGE, INDEX]; => abc(EDGE, INDEX);
...
abc[EDGE, otherArray[1]]; => abc[EDGE, otherArray[1]);
abc[array[VERT], other[INDEX]]; => abc(array[VERT], other[INDEX]);
Редактировать:
,
имеет значение (это массив 2d), их следует исключить:
abc[1]; <--- ignore
abc[1, 2, 3]; <-- ignore
abc[index]; <-- ignore
abc[otherArray[EDGE], 2, 8]; <-- ignore
Спасибо.
Редактировать2:
Привет, замена, твой ответ работает почти идеально, за исключением этой строки:
if (test[0])
{
triangles.push_back(tris[i, V1]); // <-- fail here, it gets 'test[0]' involved
triangles.push_back(tris[i, V2]);
triangles.push_back(tris[i, V3]);
}
как вы можете видеть в примерах, это двумерный массив, поэтому только два элемента, другие случаи игнорируются. я перегрузил оператор (int, int) в С++ для имитации [,] в С#.
Я отредактировал исходный ответ, который должен работать для вашего варианта использования.
Вы можете использовать это регулярное выражение для захвата содержимого между []
.\[(.*)\]
Чтобы устранить необходимость соответствия только приведенным выше примерам, вы можете использовать\[([^,\n]+,[^,\n]+)\]
Смотрите: https://regex101.com/r/tfY6cs/1
В поле замены вы можете использовать\(\1\)
поставить (<captured group1>)
Если вам нужно захватить []
рекурсивно, у вас есть два варианта.
Самый простой вариант — просто повторить поиск/замену.
Жесткий вариант - переписать регулярное выражение, чтобы оно было рекурсивным.
Смотрите также: https://stackoverflow.com/a/17392520/19192256
Почти идеально, но есть недостаток, см. мой исходный пост (Редактировать 2), похоже, я не могу поместить сюда код.
Привет, 21к. Вы можете настроить его на этот \[([^,\n]+,[^,\n]+)\]
, который должен обрабатывать эти надоедливые символы новой строки между [ и ].
Ваш ответ очень помогает и экономит много работы. Единственный случай отказа это: process(points[1].coords, points[2].coords, points[3].coords, points[4].coords);
но это не беда, мне просто нужно пропустить их (несколько).
Вы можете использовать
\[(\w+(\[(?:[^][]++|(?-1))*])*\s*,\s*\w+(\[(?:[^][]++|(?-1))*])*)]
Посмотрите демонстрацию регулярного выражения . Замените на \($1\)
(круглые скобки нужно экранировать, так как они особенные в замене регулярных выражений Boost).
Подробности:
\[
- [
символ(\w+(\[(?:[^][]++|(?-1))*])*\s*,\s*\w+(\[(?:[^][]++|(?-1))*])*)
- Группа 1:
\w+
- один или несколько символов слова(\[(?:[^][]++|(?-1))*])*
- ноль или более подстрок между парными вложенными квадратными скобками\s*,\s*
- запятая, заключенная с нулем или более пробелами\w+(?:(\[(?:[^][]++|(?-1))*])*)?
- один или несколько символов слова, а затем ноль или более подстрок между парными вложенными квадратными скобками]
- символ ]
.Демонстрация Блокнота++:
Это отличный ответ, который подходит для гораздо большего количества вариантов использования, но для этого конкретного вопроса они хотели что-то конкретное для Notepad ++; Я не уверен, как работает подстановка в Notepad++ в отношении поиска и замены.
@Substitute Этот ответ для Notepad++. Смотрите скриншот. Заменяются только ожидаемые 5 строк из 9.
Эти шаблоны потрясающие :-) ++
Ваш ответ более точен, он успешно идентифицирует этот случай: process(points[1].coords, points[2].coords, points[3].coords, points[4].coords);
который не соответствует приведенному выше ответу. Потрясающий!
К вашему редактированию, вы просите захватить только четные группы или только группы из 2? Ваши примеры выше имеют длину 2 элемента, а примеры без захвата — 1 и 3; оставляя abc[1,2,3,4] неоднозначным.