По умолчанию .
не соответствует \r
и \n
. Попробуйте:
def matches = ctext =~ /(?s)<code>(.*?)<\/code>/
, где (?s)
называется модификатором DOT-ALL (чтобы .
соответствовал чему угодно). Я также сделал .*
не жадным, поместив ?
после него. В противном случае он будет соответствовать самому первому <code>
и самому последнему
(и всему, что находится между ними).
Поймите, что ваше регулярное выражение прерывается, если ваш ввод выглядит так:
<code>int main(){
printf('Hello </code> World!\n');
</code>
назвать только один из множества угловых случаев. В этом случае вам нужен правильный синтаксический анализатор для вашего языка.
EDIT
Небольшая демонстрация:
def ctext = """This is the normal text.
This is the again normal text.
<code>int main(){
printf('Hello World!\\n');
return 0;}
</code>
This is the again normal text.
This is the again normal text.
<code>
public static void main (String args[]){
System.out.println('Hello World!\\n');
return 0;}
</code>
The last line ....
"""
def matches = ctext =~ /(?s)<code>(.*?)<\/code>/
matches.each { println it[1] }
производит:
int main(){
printf('Hello World!\n');
return 0;}
public static void main (String args[]){
System.out.println('Hello World!\n');
return 0;}
Как можно проверить на: http://ideone.com/JQ0Ck