LINUX.ORG.RU

Rust - не работают регулярные выражения

 ,


1

2

Есть регулярка

^\s*(?P<real>\\-?\d+(?:\\.\d+)?)(?P<imagine>[\\-\\+][i]\d+(?:\\.\d+)?)?
Которая отлично рабоатет, например, здесь: http://regex101.com/r/aC3tM6/1 (двойное экранирование заменено одинарным)
Но совершенно не работает в следующем коде:
let mut input_s = "25.6723+i2234.45";
let num_re = regex!(r"^\s*(?P<real>\\-?\d+(?:\\.\d+)?)(?P<imagine>[\\-\\+][i]\d+(?:\\.\d+)?)?");

println!("Input string: {}", input_s);

match num_re.captures(input_s)
{
	Some(cap) =>
	{
		println!("Capture real: {}", cap.name("real"));
	},
	None => println!("None"),
}
Что я делаю не так? Компилятор последней pre-nightly сборки.
➜ rustc --version
rustc 0.12.0-pre-nightly (2e3858179 2014-09-03 00:51:00 +0000)



Последнее исправление: devpony (всего исправлений: 1)

оу, ща опять походу будут споры на счет годности Rust`а)

Lamsing
()

Слишком много экранирования: http://is.gd/v1yk6U. Если бы ты просто скопировал regexp с той ссылки, то компилятор бы указал тебе, что экранировать символы + и - не нужно.

theNamelessOne ★★★★★
()
Последнее исправление: theNamelessOne (всего исправлений: 1)

Видно, сложноват твой регэксп для regex!

tailgunner ★★★★★
()
Ответ на: комментарий от theNamelessOne

Спасибо. Я почему-то был уверен что нужно, даже не знаю откуда.

devpony
() автор топика

Ну вот, тема про Rust, а я все пропустил)

Могу только добавить, что

...последней pre-nightly сборки...

«pre» связано не с «nightly», а с «0.12.0-». Т.е. нет никакой «предварительной ночной сборки».

И что форматирование кода расходится с «Rust Guidelines»: у тебя табы вместо четырех пробелов (http://aturon.github.io/style/whitespace.html) и открывающие фигурные скобки на собственной строке вместо прилепления к прошлой строке (http://aturon.github.io/style/braces.html).

Скорей бы rustfmt оживили/допилили и сделали официальным, эх.

ozkriff
()

А я что-то вообще не видел, чтобы вот такое

[\\-\\+]
использовалось где-то. В символьном классе ничего из перчисленного там метасимволами не считается (тире — только если указывает диапазон), или не везде так?

anonimous
()
Ответ на: комментарий от MyTrooName

Тильду не вернули. Как я понимаю, количество людей, которым нравился синтаксис с тильдой все-таки меньше сторонников box, так что вряд ли вернут.

Изменений еще порядочно будет, но суть языка координально менять никто, вроде, не собирается. Хотя мне интересно, как, например, реализация HKT скажется на стандартной библиотеке.

Что касается стабильности стандартной библиотеки, можно посмотреть http://doc.rust-lang.org/std/stability.html. Если я правильно понял, то даже к 1.0 там не у всего будет зеленый рейтинг - некоторые вещи останутся помеченными как нестабильные или экспериментальные, но их должно стать намного меньше.

ozkriff
()
Ответ на: комментарий от Deleted

В смысле? Я не трогал виндовую версию уже с полгода, но официальный установщик под винду, вроде, на месте: http://www.rust-lang.org/install.html - «Windows installer (.exe)» - https://static.rust-lang.org/dist/rust-nightly-install.exe.

Другое дело, что у винды много, кхм, особенностей и никто из разработчиков, насколько я знаю, ее толком не использует, так что качество виндовой версии хуже маковской или линуксовой. Ну, пол года назад виндовая версия точно была кривовата.

ozkriff
()
Ответ на: комментарий от ozkriff

Тильду не вернули. Как я понимаю, количество людей, которым нравился синтаксис с тильдой все-таки меньше сторонников box, так что вряд ли вернут.

Кстати, насчёт тем для срача...
https://github.com/rust-lang/rfcs/pull/204
https://github.com/rust-lang/rfcs/pull/208

quantum-troll ★★★★★
()
Ответ на: комментарий от ozkriff

Вместо того, чтобы тыкать мне фантазиями разработчиков как я должен писать код, лучше скажи почему я в языке с «algebraic data types» не могу сделать

#[deriving(Eq)]
struct Number {
    re: f64,
    im: f64
}

devpony
() автор топика
Ответ на: комментарий от devpony

Вместо того, чтобы тыкать мне фантазиями разработчиков как я должен писать код

Есть какой-то смысл не следовать этим «фантазиям»?

лучше скажи почему я в языке с «algebraic data types» не могу сделать

#[deriving(Eq)] struct Number { re: f64, im: f64 }

Эм, а при чем тут ADT?

Для чисел с плавающей точкой, по очевидным причинам, не рализован полноценный Eq. Замени Eq на PartialEq: http://is.gd/PldSMo

http://doc.rust-lang.org/std/cmp/trait.PartialEq.html

http://doc.rust-lang.org/std/cmp/trait.Eq.html

ozkriff
()
Ответ на: комментарий от ozkriff

по очевидным причинам

Это по каким же и кому они очевидны? Мне вот вполне очевидно что операции не больше и равно определены над полем вещественных чисел.

devpony
() автор топика
Ответ на: комментарий от devpony

Ничего, на первом курсе универа расскажут, и станет очевидно.

Deleted
()
Ответ на: комментарий от Deleted

Ну, если это все существенные ошибки в реализации под винду, то за пол года ситуация стала заметно лучше, тогда было совсем уж плохо. Чего-то большое, видимо, хрен скомпилируешь без головной боли, но теперь хоть можно спокойно собрать более-менее простую программу.

И все-таки винда является одной из целевых платформ, пускай и низкоприоритетной, так что к концу года я бы ждал более стабильной поддержки.

Лично меня больше интересует поддержка андроида - там сейчас хоть и можно запустить простенькое opengles приложение, но все как-то сильно через задницу приходится делать. И cargo вообще пока не дружит андроидом :(.

ozkriff
()
Ответ на: комментарий от devpony

Мне вот вполне очевидно что операции не больше и равно определены над полем вещественных чисел.

А разрабам Rust очевидно, что числа с плавающей точкой - это не поле вещественных чисел.

tailgunner ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.