LINUX.ORG.RU

Вопрос по регулярным выражениям в C++11

 , ,


0

3

Собственно, вопрос больше по самим регэкспам.

Выражение ниже парсит строки с отдельными слагаемыми произвольного полинома - выражения вида '13*x^4'. Однако регэксп не работает, когда слагаемое вырождается до константы. То есть ещё '13*x' оно распознаёт, а вот '13' уже нет, выдаёт пустой match_results.

std::regex rex("([-+]?[1-9]?[0-9]*)"
	       "(\\*?)"
	       "(x)"
	       "(\\^?)"
	       "([1-9]?[0-9]*)",
	       std::regex::extended);
В принципе, я уже подпёр костылями, однако хочется красоты и изящества. Что посоветуете?

★★★★★

Заменить

	       "(x)"
	       "(\\^?)"

на что-то вроде

	       "(x\\^)?"

?

xaizek ★★★★★
()
Последнее исправление: xaizek (всего исправлений: 1)
/ (?: ([-+]? [1-9]\d*) \* )? x (?: \^ ([1-9]\d*) )? |
      ([-+]? [1-9]\d*)
/x

Коэффициент ищи в первой или третьей группе, если он в первой, то показатель во второй, иначе 0.

Поскольку должен быть как минимум либо икс, либо число, то без палки не обойтись.

anonymous
()
"([+-][1-9][0-9]*)?"
"((x)(\\^[1-9][0-9]*)?)?"

А так? (лень проверять синтаксис, просто идею подкидываю)

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

Use re2c, Luke

Серьезно, после появления захватывающих скобок в 1.0 использовать рантаймовые регулярки нет никакого смысла (если, конечно, выражение как у тебя известно в момент компиляции)

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

Это да, но вроде его можно конвертнуть без потерь.

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