Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [JAVA] Regexp


Автор: sergejzr 4.7.2008, 10:37
Приветы! smile

мен надо парсить прологовские переменные из предиката.
Это означает, что в выражении типа exp(X,Y,Z,'sdad') должны выпарсится переменные, начинающиеся с большой буквы т.е в этом случае: X Y Z
Соответственно в таком выражении:

exp1(exP2(X,Y,'fsdfds'),Z,a) 

тоже X,Y,Z

При этом в самих предикатах
Т.е надо всё из скобок, начинающееся с большой буквы, но не имя предиката.

Можно это сделать коротко и красиво? и как?

Автор: kemiisto 8.7.2008, 17:49
Давно я не заглядывал в Центр помощи.

Регулярное выражение: (\W)([A-Z])+(\w)*
То есть 
сначала любой символ, кроме латиницы или цифры,
затем 1 или более заглавных латинских букв
и, наконец, 0 или более латиницы или цифр.

Группируем. Ответом будет группа 2 + группа 3.

Я к сожалению не знаю, как это записать на Java, но на Delphi
Код

procedure TForm1.Button1Click(Sender: TObject);
var
  RegExp: TRegExpr;
begin
  RegExp := TRegExpr.Create;
  RegExp.Expression := '(\W)([A-Z])+(\w)*';
  if RegExp.Exec(TestMemo.Text) then
  repeat
    Memo1.Lines.Add(RegExp.Match[2] + RegExp.Match[3]);
  until not RegExp.ExecNext;
end;
 

В архиве исходник + откомпилированная программа.

Автор: sergejzr 8.7.2008, 23:28
Спасибо! smile

Автор: Stqs 11.7.2008, 00:27
очень интересно
пытаюсь на java переписать функцию - ничего не получается

Код

String s = "^(\\W)([A-Z])+(\\w)*$";
Pattern p = Pattern.compile(s);

private void doMatch(String str){    
    Matcher m = p.matcher(str);
    if (m.matches()) {
        System.out.println(m.group(2)+m.group(3));
    }
}


проверка matches дает false.. это что-то у меня неверно или регулярка всетаки неправильная?
и еще
могут ли переменные быть вида "Xxx"? то есть строка вида exp(Xxx,Yyy,Zzz,'sdad') ?
если да - то регулярка точно не подходит.. )

Автор: kemiisto 11.7.2008, 14:37
Stqs, до сегоднешнего дня я знал только то, что Java - это ЯП. Но Вы вынудили меня попотеть.

Итог:
Код

import java.util.regex.*;

public class Ex1 {
    
    public static void main(String[] args) {
        String s = "(\\W)([A-Z])+(\\w)*";
        Pattern p = Pattern.compile(s);
        Matcher m = p.matcher("exp1(exP2(X,Y,'fsdfds'),Z,a)");
        while (m.find()){
            if (m.group(3) == null) 
                System.out.println(m.group(2));
            else
                System.out.println(m.group(2) + m.group(3));
        }
    }

}


Вот что у меня получилось. Это почти полный аналог Delphi-кода. И вроде работает  smile   

Автор: sergejzr 11.7.2008, 16:31
Спасибо ещё раз! smile Я немножко изменил..
Код

import java.util.regex.*;
public class Ex1 {
    
    public static void main(String[] args) {
        String s = "(\\W)([A-Z][a-z]*)+(\\w)*";
        Pattern p = Pattern.compile(s);
        Matcher m = p.matcher("exp1(sF,O,exP2(Xg,Ysdfsdf,'fsdfds'),Z,a,L)");
        while (m.find()){
            if (m.group(3) == null) 
                System.out.println(m.group(2));
            else
                System.out.println(m.group(2) + m.group(3));
        }
    }
}

Автор: Stqs 11.7.2008, 20:54
 smile 
копировал и запустил последнюю версию - вывод - Ysdfsdf, Z, L
куда девается Xg ?

Автор: Stqs 11.7.2008, 21:59
ага 
все 
разобрался
извиняюсь smile
действительно все работает...

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