Regex - получить код между двумя комментариями - PullRequest
2 голосов
/ 20 ноября 2011

Как я могу получить

Text t;
Graph g;

из

// Co
Text t;
Graph g;
// Co

?

// Co\r?\n(.*)\r?\n// Co

работает, когда есть одна строка, но не работает с несколькими строками.

1 Ответ

5 голосов
/ 20 ноября 2011

По умолчанию . соответствует любому символу, кроме символов новой строки (\n), но вы можете использовать флаг Pattern.DOTALL , чтобы он соответствовал символам новой строки.Так, например, вместо этого:

final Pattern pat = Pattern.compile("// Co\r?\n(.*)\r?\n// Co");

вы бы использовали это:

final Pattern pat = Pattern.compile("// Co\r?\n(.*)\r?\n// Co", Pattern.DOTALL);

Эквивалентно, вы можете установить флаг s внутри самого регулярного выражения, используя любой изэти стили:

final Pattern pat = Pattern.compile("// Co\r?\n((?s).*)\r?\n// Co");
final Pattern pat = Pattern.compile("// Co\r?\n(?s:(.*))\r?\n// Co");

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

Отредактировано, чтобы добавить: Кажетсявесьма вероятно - но вам придется определить это для себя, исходя из вашего варианта использования - что вам нужно использовать нежадное количественное определение, .*?, а не жадное количественная оценка, .*.

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