Задать вопрос

Работа regexp в java и javascript

Привет, Хабр!

Имею проблему с регуляркой для java.
Нужно распарсить выражение типа: object[attr1=val1 attr2=val2 attr3=val3]
Используемая регулярка в js работает штатно: выдает имя объекта и атрибуты:

/^(\w+)(?:\[(\w+=\w+)(?:\s(\w+=\w+))*\])?$/

В java, в той же регулярке, я получаю название объекта и только первый атрибут.

Pattern pathPattern = Pattern.compile("^(\\w+)(?:\\[(\\w+=\\w+)(?:\\s+(\\w+=\\w+))*\\])?$");

Если кто сталкивался, прошу просветить в этом вопросе.
Спасибо.
  • Вопрос задан
  • 3662 просмотра
Подписаться 4 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 3
@tsegorah
А вам что нужно получить из исходной строки, вам надо выцепить пары attr1=val1?
Если да, то тогда так сработает

        String inpt= "object[attr1=val1 attr2=val2 attr3=val3]";
        Pattern pathPattern = Pattern.compile("\\w{1,}=\\w{1,}");
        Matcher matcher = pathPattern.matcher(inpt);     
// перебор по результатам
        while(matcher.find()){
            String tmp = inpt.substring(matcher.start(), matcher.end()) ;
            System.out.println(tmp);
        }


на выходе будет:
attr1=val1
attr2=val2
attr3=val3
Ответ написан
@relgames
Java Developer
Как написано тут, это в принципе не решаемо только лишь regexp-ом. Нужно вручную делить строку на 2 выражения, в начале выделить то, что внутри скобок, потом парсить эту подстроку:

        Pattern pathPattern = Pattern.compile("(\\w+=\\w+\\s*)");
        Matcher matcher = pathPattern.matcher("sdf=ff ggg=dd hhh=44 jjj=5456");
        while (matcher.find()) {
            for (int i=1; i<=matcher.groupCount(); i++) {
                System.out.println(matcher.group(i));
            }
        }


Вывод:
sdf=ff 
ggg=dd 
hhh=44 
jjj=5456
Ответ написан
Комментировать
Damaskus
@Damaskus Автор вопроса
Судя по всему Matcher выдает всегда фиксированное количество групп соответствующее количеству пар скобок определяющих выходную выборку.
Самое странное, что эту регулярку на совпадение использовать можно, а совпавшие данные вытащить нельзя.
Одношаговое решение как в js невозможно.
Кто нибудь знает, есть другие реализации RegExp для java?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы