Как мне сопоставить захват нескольких шаблонов с помощью REGEX? (Рубин) - PullRequest
0 голосов
/ 10 апреля 2011

Вот моя тестовая строка, которую я пытаюсь записать с помощью ruby:

<?lang 
  this_should_be_captured();
  and_also_this();
  and_this();
?>

this text should NOT be captured

<?lang this_should_also_be_captured(); ?>

Когда я использую это регулярное выражение:

(<\?lang(\n|.)*\?>)

Совпадение захватывает все (включая часть, которая мне не нужна: «этот текст НЕ должен быть захвачен»), как показано на http://rubular.com/r/qSOOzq6HAx.

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

Ответы [ 2 ]

4 голосов
/ 10 апреля 2011

Вы хотите использовать ленивый квантификатор .

(<\?lang(\n|.)*?\?>)

Добавление ? после квантификатора * означает, что оно будет ленивым . Это означает, что вместо попытки использовать как можно больше символов для сопоставления ( жадный ) он будет использовать минимум для соответствия выражению.

1 голос
/ 10 апреля 2011

Вы можете сделать это проще, используя многострочный режим. Вам также не нужны внешние скобки, потому что они совпадают со всем соответствием, которое вы можете получить с помощью $~. Если вы хотите захватить то, что находится внутри <?lang ?>, тогда вы можете поместить туда скобки.

/<\?lang(.*?)\?>/m

PS.

  • Если шаблон чередования представляет собой один символ, вы можете использовать [ ] вместо скобок ( ). Например, [\n.]
  • Даже если вам нужно использовать скобки для отображения чередования, вы должны использовать паретезы без захвата (?: ), если вам не нужно ссылаться на контент, потому что это сделает это быстрее, чем использование скобок захвата ( ). Например, (?:\n|.)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...