Совпадение внутри строки, но игнорирование совпадений в скобках - Regex и JavaScript

1

У меня есть следующие примеры строк:

 "1. go [south], but look out for the trout pouting [lout]"
 "2. go [south], but be wary of the pouting [lout]"
 "3. go [south], but be wary of the sullen-looking [lout]"

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

  1. Истинный для фокуса, форели и надувания
  2. Действительно для надувания
  3. Ложь

Мне удалось дойти до этого выражения:

/[^\(\)\[\]]out\s(?![\]])/ig

Тем не менее, это только соответствие первой строки для отказа и форелей.

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

Каким будет правильное регулярное выражение для этого?

Теги:

1 ответ

1
Лучший ответ

Предполагая, что [...] сбалансированы и не привязаны, вы можете использовать отрицательный поиск на основе поиска:

/out(?![^\[\]]*\])/

(?![^\[\]]*\]) Является отрицательным опережением, который утверждает, что мы не имеем ] следующий non- [ и non- ] символы вперед, таким образом, убедившись, что мы не соответствующими out внутри a [...].

Код Javascript для создания вашего регулярного выражения:

search = "out";
var regex = new RexExp(search + "(?![^\\[\\]]*\\])", "g");

Демо-версия RegEx

  • 1
    Хотя Раджеш дал хороший ответ выше, я собираюсь использовать ваш метод, так как он более надежный. Большое спасибо за вашу помощь, Анубхава.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню