Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Регулярное выражение выдает лишнее в одном случае


Автор: Mephisto 14.3.2014, 09:12
Привет всем.
Столкнулся с задачей необходимости разобрать текст регуяркой, так как сталкиваюсь с ними редко задачка сломала мозг.
Есть такого рода строки:
Цитата
<t:outputLabel value="#{msgs['recovery_password.form.login']}" for="LOGIN" forceId="true" />

зеленым выделил то что нужно извлечь из строки.
Написал регулярку
Код

\p{Punct}\p{Punct}msgs\p{Punct}'(.*)'

Работает прекрасно до тех пор пока в одной строке не встречается что-то вроде:
Цитата
<t:commandLink value="#{msgs['recovery_password.form.btn.restore']}" action="#{pwdRecovery.actionRecoveryPassword}" title="#{msgs['recovery_password.form.restore']}" id="btnStore" forceId="true"/>

Последнее правило нужно как-то специфицировать иначе. Но не пойму как. )) Потому как последнее исполняется дважды.
По идее нужно выбрать 
Цитата
<t:commandLink value="#{msgs['recovery_password.form.btn.restore']}" action="#{pwdRecovery.actionRecoveryPassword}" title="#{msgs['recovery_password.form.restore']}" id="btnStore" forceId="true"/>

Если кто понимает в какую сторону посмотреть, или решение, буду весьма признателен.
Спасибо.

Автор: danilych 14.3.2014, 09:20
советую погуглить про жадные и ленивые кванторы

Автор: baldina 14.3.2014, 09:21
Код

"#\{msg\['(.*)?'\]\}"

Автор: Mephisto 14.3.2014, 09:44
Цитата(danilych @  14.3.2014,  10:20 Найти цитируемый пост)
советую погуглить про жадные и ленивые кванторы 

Да, как раз с ними мозг и взрывался. Не понимал как использовать.

Цитата(baldina @  14.3.2014,  10:21 Найти цитируемый пост)
"#\{msg\['(.*)?'\]\}"

Вообще в выборку ничего не попало :(

Спасибо.
В результате получилось так:
Цитата
#\p{Punct}msgs\p{Punct}'(.*?)'

Автор: baldina 14.3.2014, 10:16
ну да, знак вопроса в скобках)

Добавлено через 2 минуты и 41 секунду
Код

#\{msgs\['(.*?)'\]\}

Автор: Pawl 14.3.2014, 11:51
еще можно так:
Код

package regular;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static void main(String[] args) {
        String line = "<t:commandLink value=\"#{msgs['recovery_password.form.btn.restore']}\" action=\"#{pwdRecovery.actionRecoveryPassword}\" title=\"#{msgs['recovery_password.form.restore']}\" id=\"btnStore\" forceId=\"true\"/>";
        Pattern p = Pattern.compile("#\\{msgs\\['(\\S*)?'");
        Matcher m = p.matcher(line);
        while (m.find()) {
            System.out.println(m.group());
        }
    }
}

На выходе получается
Код

#{msgs['recovery_password.form.btn.restore'
#{msgs['recovery_password.form.restore'

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)