как использовать строку отрицания регулярного выражения - PullRequest
1 голос
/ 07 июля 2010

Может ли кто-нибудь сказать мне, как использовать регулярное выражение для отрицания строки? Я хочу найти все строки, которые начинаются с public class, а затем any thing except first,second и, наконец, что-нибудь еще.

например, в результате я ожидаю увидеть public class base, но не public class myfirst:base Может ли тело помочь мне, пожалуйста?

Ответы [ 4 ]

3 голосов
/ 08 июля 2010

Если Питер прав, и вы используете функцию Find Visual Studio, это должно работать:

^:b*public:b+class:b+~(first|second):i.*$

:b соответствует пробелу или табуляции
~(...) - это то, как VS смотрит в будущее
:i соответствует идентификатору C / C ++

Остальное - стандартный синтаксис регулярных выражений:
^ для начала строки
$ для конца строки
. для любого персонажа
* для нуля или более
+ для одного или нескольких
| для чередования

2 голосов
/ 07 июля 2010

Используйте негативный взгляд:

public\s+class\s+(?!first|second).+
1 голос
/ 07 июля 2010

Оба других ответа близки, но, вероятно, не по разным причинам.

public\s+class\s+(?:(?!first|second).)+

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

И эта группа менее ограничительна - поскольку . исключает символ новой строки, она использует ее вместо \S, а $ не требуется - это исключит указанные слова и совпадет с другими.

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

Если это по-прежнему не удается, опубликуйте точное содержимое, которое было ошибочно сопоставлено или пропущено, и какой язык / ide вы используете.

Обновление:
Оказывается, вы используете Visual Studio, которая имеет собственную специальную реализацию регулярных выражений , по непонятной причине. Итак, вы захотите попробовать это вместо:

public:b+class:b+~(first|second)+$

У меня нет способа проверить это - если это не сработает, попробуйте сбросить $, но в противном случае вам придется найти пользователя VS. Или, что еще лучше, инженеры VS, ответственные за это глупое нестандартное регулярное выражение.

0 голосов
/ 07 июля 2010

Вот то, что должно работать для вас

/public\sclass\s(?:[^fs\s]+|(?!first|second)\S)+(?=\s|$)/

Второй взгляд: голова может быть заменена на $ (конец строки) или другой якорь, который подходит для вашего конкретного случая использования, например, '{'

Редактировать: Попробуйте изменить последнюю часть на:

(?=\s|$)
...