регулярное выражение, чтобы найти экземпляр слова или фразы - за исключением случаев, когда это слово или фраза в скобках - PullRequest
2 голосов
/ 03 февраля 2010

Во-первых, отказ от ответственности. Я немного знаю о регулярных выражениях, но я не эксперт. Похоже, они мне действительно нужны два раза в год, поэтому они просто не остаются "на вершине" моего мозга.

Ситуация: я хотел бы написать регулярное выражение для соответствия определенному слову, назовем его «Страус». Легко. За исключением того, что Страус может иногда появляться внутри фигурной скобки. Если это внутри фигурной скобки, это не совпадает. Хитрость в том, что внутри фигурных скобок могут быть пробелы. Также текст обычно находится внутри абзаца.

Это должно соответствовать: I have an Ostrich.

Это не должно совпадать: My Emu went to the {Ostrich Race Name}.

Это должно быть совпадение: My Ostrich went to the {Ostrich Race Name}.

Это не должно совпадать: My Emu went to the {Race Ostrich Place}. My Emu went to the {Race Place Ostrich}.

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

Ответы [ 5 ]

2 голосов
/ 03 февраля 2010

Я предложу альтернативное решение для этого, которое является более надежным (без использования утверждений регулярных выражений).

Сначала удалите все элементы в квадратных скобках, используя регулярное выражение, например {[^}]+} (используйтезаменить, чтобы изменить его на пустую строку).

Теперь вы можете просто искать Страуса (используя регулярное выражение или простое сопоставление строк, в зависимости от ваших потребностей).

0 голосов
/ 03 февраля 2010

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

(?<!{[^}]*)Ostrich(?=[^}]*)

0 голосов
/ 03 февраля 2010

Вот очень большое регулярное выражение, которое почти работает.

Он будет возвращать каждое «сырое» вхождение слова в группу.
Тем не менее, группа для последнего будет пустой; Я не уверен почему. (Протестировано с .Net)

Разбор без пробелов

^(?:

    (?:
        [^{]
        |
        (?:\{.*?\})
    )*?

    (?:\W(Ostrich)\W)?
)*$
0 голосов
/ 03 февраля 2010

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

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

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

Токенайзер персонажа, который обрабатывает фигурные скобки, будет достаточно легко написать.

0 голосов
/ 03 февраля 2010

Я полагаю, что это сработает, используя утверждения типа lookahead и lookbehind:

(?<!{[^}]*)Ostrich(?![^{]*})

Я также проверил случай My {Ostrich} went to the Ostrich Race. (где второй «Страус» соответствует)

Обратите внимание, что предварительное утверждение: (?![^{]*}) необязательно, но без него:

  • My {Ostrich has a missing bracket не будет соответствовать
  • My Ostrich also} has a missing bracket будет соответствовать

что может или не может быть желательным.

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

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