Модераторы: Poseidon
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [JAVA] Regexp 
:(
    Опции темы
sergejzr
Дата 4.7.2008, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Приветы! smile

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

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

тоже X,Y,Z

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

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


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
kemiisto
Дата 8.7.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 16
Всего: 160



Давно я не заглядывал в Центр помощи.

Регулярное выражение: (\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;
 

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


Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  regexp.zip 274,82 Kb


--------------------
PM MAIL WWW GTalk Jabber   Вверх
sergejzr
Дата 8.7.2008, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Спасибо! smile


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Stqs
Дата 11.7.2008, 00:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 25.6.2007
Где: Kh

Репутация: 1
Всего: 1



очень интересно
пытаюсь на 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') ?
если да - то регулярка точно не подходит.. )
PM MAIL ICQ Skype   Вверх
kemiisto
Дата 11.7.2008, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Дикий Кот. =^.^=
****
Награды: 1



Профиль
Группа: Участник Клуба
Сообщений: 3292
Регистрация: 29.7.2007

Репутация: 16
Всего: 160



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   

Это сообщение отредактировал(а) kemiisto - 11.7.2008, 14:38


--------------------
PM MAIL WWW GTalk Jabber   Вверх
sergejzr
Дата 11.7.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 11
Всего: 360



Спасибо ещё раз! 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));
        }
    }
}



--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Stqs
Дата 11.7.2008, 20:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 25.6.2007
Где: Kh

Репутация: 1
Всего: 1



 smile 
копировал и запустил последнюю версию - вывод - Ysdfsdf, Z, L
куда девается Xg ?
PM MAIL ICQ Skype   Вверх
Stqs
Дата 11.7.2008, 21:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 25.6.2007
Где: Kh

Репутация: 1
Всего: 1



ага 
все 
разобрался
извиняюсь smile
действительно все работает...
PM MAIL ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Центр помощи"

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!


  • Название темы должно отражать её суть! (Не следует добавлять туда слова "помогите", "срочно" и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например "школьная задача", "задача из учебника" и т.п.), не нужно указывать ее сложность ("простая задача", "легкий вопрос" и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку "Код"). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик - один вопрос!
  • В данном разделе запрещено поднимать темы, т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой "Пометить как решённый", которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Центр помощи | Следующая тема »


 




[ Время генерации скрипта: 0.1156 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.