Регулярное выражение для соответствия подчеркиваниям, не заключенным в квадратные скобки? - PullRequest
3 голосов
/ 24 марта 2009

Может ли кто-нибудь предложить регулярное выражение для соответствия подчеркиванию в следующих примерах:

test_test
test[_test
test_]

Но НЕ соответствует этому:

test[_]test

Используется библиотека регулярных выражений .Net. Я использую этот тестер RegEx для проверки:

http://derekslager.com/blog/posts/2007/09/a-better-dotnet-regular-expression-tester.ashx

Ответы [ 5 ]

5 голосов
/ 24 марта 2009

Попробуйте это:

_[^\]]|[^[]_

Он состоит из чередования _[^\]] (подчеркивание, а не ]) и [^[]_ (не [ и подчеркивание).

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

_(?=[^\]])|_(?<=[^[]_)

Это соответствует любому подчеркиванию, за которым не следует ] ((?=[^\]]), положительный прогноз) или любому подчеркиванию, которому не предшествует [ ((?<=[^[]_), отрицательный просмотр). И это может быть объединено с:

_(?:(?=[^\]])|(?<=[^[]_))
2 голосов
/ 24 марта 2009
_(?!\](?<=\[_\]))

Если за подчеркиванием не стоит закрывающая скобка, отрицательный прогноз сразу же срабатывает. В противном случае он смотрит назад, чтобы выяснить, не стоит ли подчеркивание перед открывающей скобкой. Вы можете заменить "_]" точками, чтобы было ясно, что на этот раз вас интересует только открывающая скобка:

_(?!\](?<=\[..))

Вы можете сначала посмотреть назад, если хотите:

_(?<!\[_(?=\]))

Важно то, что второй обходной путь должен быть вложен в первый, чтобы достичь семантики "NOT (x AND y)".

Тестируя его в EditPad Pro, он соответствует подчеркиванию во всех, кроме последней из следующих строк:

test_test
test[_test
test_]
_]Test
Test[_
test[_]test

РЕДАКТИРОВАТЬ: вот более простая для чтения версия:

(?<!\[)_|_(?!\])

Что мне нравится в версии с вложенным внешним видом, так это то, что она ничего не делает, пока не находит подчеркивание. Если движок регулярных выражений не достаточно умен, оптимизируйте его, эта версия "(NOT x) OR (NOT y)" будет негативно смотреть на каждую позицию.

1 голос
/ 24 марта 2009

((|?! (]))

, который использует отрицательный взгляд вперед / назад (а не положительный взгляд / сзади и исключенные символы).

1 голос
/ 24 марта 2009

Я не знаю о .Net, но регулярное выражение будет состоять из двух частей, одна из которых соответствует любому символу, кроме скобки, за которой следует подчеркивание, а другая - наоборот:

[^\[](_)|(_)[^\]]

Редактировать: только что заметил, что вам нужно добавить случаи, когда подчеркивание находится в начале или в конце:

[^\[](_)|(_)[^\]]|^_|_$
0 голосов
/ 24 марта 2009

Попробуйте

^.*(\[_[^\]])|([^\[]_\])|([^\[]_[^\]]).*$

РЕДАКТИРОВАТЬ: Теперь обрабатывает

test_test

Не проверено, но прочитано: любая строка символов, за которой следует либо [_, затем любой символ , но ] или любой символ но [ затем _]

Обратите внимание, что это может не работать в таких случаях, как

_]Test
Test[_

Не знаю, для тебя это проблема?

Успешно протестировано со всеми вашими примерами

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...