_(?!\](?<=\[_\]))
Если за подчеркиванием не стоит закрывающая скобка, отрицательный прогноз сразу же срабатывает. В противном случае он смотрит назад, чтобы выяснить, не стоит ли подчеркивание перед открывающей скобкой. Вы можете заменить "_]" точками, чтобы было ясно, что на этот раз вас интересует только открывающая скобка:
_(?!\](?<=\[..))
Вы можете сначала посмотреть назад, если хотите:
_(?<!\[_(?=\]))
Важно то, что второй обходной путь должен быть вложен в первый, чтобы достичь семантики "NOT (x AND y)
".
Тестируя его в EditPad Pro, он соответствует подчеркиванию во всех, кроме последней из следующих строк:
test_test
test[_test
test_]
_]Test
Test[_
test[_]test
РЕДАКТИРОВАТЬ: вот более простая для чтения версия:
(?<!\[)_|_(?!\])
Что мне нравится в версии с вложенным внешним видом, так это то, что она ничего не делает, пока не находит подчеркивание. Если движок регулярных выражений не достаточно умен, оптимизируйте его, эта версия "(NOT x) OR (NOT y)
" будет негативно смотреть на каждую позицию.