Groovy Регулярное сопоставление всего между тегом - PullRequest
1 голос
/ 11 марта 2011

У меня есть текстовая строка примерно такая:

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 ....
"""

Я хочу заменить все вхождения текста между разделами '<code>(.*) ', передав это методу, подобному doBeautify(codeText).

Я пытаюсь так, но не повезло:

def matches = ctext =~ /<code>(.*)<\/code>/

Любая помощь оценена. Спасибо

Ответы [ 2 ]

8 голосов
/ 11 марта 2011

По умолчанию . не соответствует \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

0 голосов
/ 11 марта 2011

Вы пробовали модификатор (?m) для многострочных регулярных выражений?

Барт Киерс упомянул в своем комментарии, что это бесполезно, вы должны использовать модификатор dot-all (?s). Спасибо, что указали на это, Барт.

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