Ищем регулярное выражение, которое соответствует всем словам, кроме тех, которые заключены в квадратные скобки - PullRequest
4 голосов
/ 31 октября 2009

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

/[a-z0-9]+(-[a-z0-9]+)*/i

У меня также есть регулярное выражение, которое соответствует всем словам в скобках:

/\[(.*)\]/i

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

Пример ввода текста: http://gist.github.com/222857 Оно должно соответствовать каждому слову отдельно, без слова в скобках.

Любая помощь приветствуется. Спасибо!

Ответы [ 6 ]

3 голосов
/ 31 октября 2009

Возможно, вы могли бы сделать это в два этапа:

  1. Удалить весь текст в скобках.
  2. Используйте регулярное выражение для сопоставления оставшихся слов.

Использование одного регулярного выражения для выполнения обеих этих задач будет более сложным, чем это необходимо.

1 голос
/ 31 октября 2009

Какую версию Ruby вы используете? Если это 1,9 или более поздняя версия, это должно делать то, что вы хотите:

/(?<![\[a-z0-9-])[a-z0-9]+(-[a-z0-9]+)*(?![\]a-z0-9-])/i
1 голос
/ 31 октября 2009

Как насчет этого:

your_text.scan(/\[.*\]|([a-z0-9]+(?:-[a-z0-9]+)*)/i) - [[nil]]
0 голосов
/ 10 января 2014

Это похоже на работу:

[^\[][a-z0-9]+(-[a-z0-9]+)*

если первая буква слова является открывающей скобкой, она не соответствует ей.

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

0 голосов
/ 31 октября 2009

Я согласен с Shhnap. Без дополнительной информации кажется, что самый простой способ - удалить то, что вам не нужно. но вместо этого он должен быть /[(.*?)]/. После этого вы можете разделить на \ s.

Если вы пытаетесь перебрать каждое слово и хотите, чтобы каждое слово совпадало, возможно, вы можете немного обмануть с помощью: string.split (/ \ W + /). Вы потеряете цитаты, а что нет, но вы получите каждое слово.

0 голосов
/ 31 октября 2009

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

string1 =~ s/\[(.*)\]//g

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

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