Сопоставление шаблонов с инструкциями Java - PullRequest
0 голосов
/ 24 июля 2010

Я пытаюсь написать простой механизм шаблонов для разбора if операторов.

<{if $value == true}>
    say hello
<{/if}>

Я написал рабочий код. Однако, если в файле есть несколько операторов if, которые я анализирую, тогда if получает только первый и последний оператор if. Например.

<{if $value1 == true}>
    say hello
<{/if}>
...
<{if $value2 == true}>
    say hello
<{/if}>
...

Код анализирует и возвращает:

    say hello
<{/if}>
...
<{if $value2 == true}>
    say hello

Вместо того, чтобы просто возвращаться say hello.

Спасибо за помощь Заранее код выглядит следующим образом:

    public class Templates {

        private static String escape(String value) {
            return value.replaceAll("\\$", "\\\\\\$");
        }

        public static String load(String name) {
            return load(name, null);
        }

        public static String load(String name, Map<String, String> parse) {

            String page = new Resources().getTextResource("lib/tpl/" + name);

            if (page == null) {
                return "The template, " + name + " was NOT FOUND.";
            }

            if (parse != null) {
                Iterator it = parse.entrySet().iterator();

                while (it.hasNext()) {

                    Map.Entry entry = (Map.Entry) it.next();
                    String key = (String) entry.getKey();
                    String value = (String) entry.getValue();

                    value = escape(value); // Prevents java exception. Can't deal with $

                    page = page.replaceAll("\\<\\{\\$" + key + "\\}\\>", value);


                }

                Pattern ptrn = Pattern.compile("\\<\\{if \\$([a-z]+)\\s*(==|!=|eq|neq|or|and)\\s*(\\w+)\\}\\>(\\p{ASCII}+)\\<\\{/if\\}\\>");

                Matcher mtch = ptrn.matcher(page);

                System.out.println("\n\n\n");

                while(mtch.find()) {

                    System.out.println("Key is: " + mtch.group(1));
                    //System.out.println("Key: " + dateMatcher.group(2));
                    System.out.println("Value is: " + mtch.group(3));
                    System.out.println("Data is: " + mtch.group(4));

                    if(parse.get(mtch.group(1)).equals(mtch.group(3))) {
                        System.out.println("\n\n\nREPLACE");
                        page = page.replaceAll(ptrn.pattern(), escape(mtch.group(4)));
                    } else {
                        //dateMatcher.appendReplacement(page, "");
                        System.out.println("\n\n\nREMOVE - " + ptrn.pattern());
                        page = page.replaceAll(ptrn.pattern(), "");
                    }

                }

                System.out.println("\n\n\n");


            }
            return page;


}
}

1 Ответ

2 голосов
/ 24 июля 2010

Это может быть связано с жадностью.

Попробуйте,

(\\p{ASCII}+?) вместо (\\p{ASCII}+)

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