Регулярные выражения
От: AlexGK Россия  
Дата: 13.09.06 15:40
Оценка:
Здравствуйте!

Столкнулся с проблемой: необходимо проверить является ли строка числом, формат такой:

[+ или -] {набор цифр}[.набор цифр] [E [+ или -] набор цфир не более 5-ти]

в квадратных скобках — необяхательная конструкция
т.е. например:

1) -0001.2323 e +345
2) +1232
3) +013.123

В общем- вещественное число в научном формате. И мне необходимо проверить соответствует ли строка формату или нет. Вот сижу пытаюсь сделать регулярное выражение в стиле Perl, но что-то совсем не получается — никогда ранее с регулярными выражениями не сталкивался.

Как составить рег. выр. для этого?

Заранее спасибо.
Re: Регулярные выражения
От: kan Великобритания  
Дата: 13.09.06 15:55
Оценка:
AlexGK wrote:

> Столкнулся с проблемой: необходимо проверить является ли строка числом,

> формат такой:
>
> [+ или -] {набор цифр}[.набор цифр] [E [+ или -] набор цфир не более 5-ти]
>
> в квадратных скобках — необяхательная конструкция
> т.е. например:
>
> 1) -0001.2323 e +345
> 2) +1232
> 3) +013.123
>
> В общем- вещественное число в научном формате. И мне необходимо
> проверить соответствует ли строка формату или нет. Вот сижу пытаюсь
> сделать регулярное выражение в стиле Perl, но что-то совсем не
> получается — никогда ранее с регулярными выражениями не сталкивался.
>
> Как составить рег. выр. для этого?
[+-]?\d+(\.\d*)?([eE][+-]?\d{1,5})?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Регулярные выражения
От: AlexGK Россия  
Дата: 13.09.06 17:56
Оценка:
Здравствуйте, kan, Вы писали:

kan>[+-]?\d+(\.\d*)?([eE][+-]?\d{1,5})?


Как ни странно — не подошло, как я понял проблема в знаке \d При замене на [0-9] работает. Так можно?
Re[3]: Регулярные выражения
От: kan Великобритания  
Дата: 14.09.06 08:44
Оценка:
AlexGK wrote:

> kan>[+-]?\d+(\.\d*)?([eE][+-]?\d{1,5})?

>
> Как ни странно — не подошло, как я понял проблема в знаке \d При замене
> на [0-9] работает. Так можно?
Можно. А почему не работает — не знаю, надо конкретный случай рассматривать, приводи код, может надо слеш удвоить?
А если работает, то, скажем "12!23" матчит?
Posted via RSDN NNTP Server 2.0
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: Регулярные выражения
От: AlexGK Россия  
Дата: 15.09.06 21:31
Оценка:
Здравствуйте, kan, Вы писали:

kan>AlexGK wrote:


kan>Можно. А почему не работает — не знаю, надо конкретный случай рассматривать, приводи код, может надо слеш удвоить?

kan>А если работает, то, скажем "12!23" матчит?

Ну видимо, потому что использую boost::regex там стиле Perl но видимо не все.

У меня получилось в конце концов такое выражение:

[[:space:]]{0,}((((([0-9]{1,}[\.]{1}[0-9]{1,})|([0-9]{1,}[\.]{1})|([\.]{1}[0-9]{1,})|([0-9]{1,}))|(([+-]{1}[[:space:]]{0,}[0-9]{1,}[\.]{1}[0-9]{1,})|([+-]{1}[[:space:]]{0,}[0-9]{1,}[\.]{1})|([+-]{1}[[:space:]]{0,}[\.]{1}[0-9]{1,})|([+-]{1}[[:space:]]{0,}[0-9]{1,}))){0,1}([[:space:]]{0,}[eE][[:space:]]{0,}[+-]{0,1}[[:space:]]{0,}[0-9]{1,}){0,1})|([+-]{0,1}[[:space:]]{0,}[eE][[:space:]]{0,}[+-]{0,1}[[:space:]]{0,}[0-9]{1,}))[[:space:]]{0,}


Работае корректно, такая трех этажность обусловлена тем, что я не знаю как записать такое выражение:

допустим есть лексемы A B C D, нужно что-то типа A&(B|C|D) ? где & — справделиво только в случае если справделивы обе части, а | — это не чисто или, а допускающее сочетания, т.е. B BC BCD BD CD
Я пробовал сделать в виде:
A{0,1}(B{0,1}C{0,1}D{0,1}){1} Но выражение в скобках в таком случае может быть пустым, поэтому выражени корректно если в тексте есть только A.
Как записать такое выражение в компактном виде, не перебирая сочетаний?
Re[5]: Регулярные выражения
От: AlexGK Россия  
Дата: 15.09.06 21:33
Оценка:
Здравствуйте, AlexGK, Вы писали:

Ну и плюс еще изучил более подробно входной формат, оказалось что допустимы конструкции вида (123. или e1 или + e1) и другие, отсюда и идет такая сложность выражения, но в случае если можно сделать то, что я спросил выше, то можно записать намного более компактно.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.