2012-05-09 3 views
7

У меня есть это регулярное выражение "^[0-9]+\.?[0-9]*$"), чтобы соответствовать двойному номеру или целому числу в visual C++, но, похоже, это не работает. есть идеи. это, как я подаю код:Regexp for double

if (System::Text::RegularExpressions::Regex::IsMatch(e0, "^[0-9]+\.?[0-9]*$")) 
      { 
       e0_val = System::Convert::ToDouble(e0); 
      } 
+2

Почему, на ваш взгляд, это не работает? Приведите пример. –

+0

@AndrewLogvinov +1, «не работает gimme tez codez» не является хорошей формой вопроса. –

+0

Пробел в начале или конце возможно? Можете ли вы опубликовать код, который его использует? –

ответ

9

Там нет ничего плохого в регулярном выражении на скажем, это ваш побег, что это по вине. Вам нужно удвоить escape-код \, так как это также символ escape-строки строки C++.

Кроме того, существует край, где это регулярное выражение будет считать, что 1. - действительный номер плавающего указателя. Таким образом, вам может быть лучше с /^[0-9]+(\\.[0-9]+)?$, что устраняет эту возможность.

2

Регулярное выражение выше не является совершенным, так как оно принимает «09», что не является допустимым числом. лучшее выражение будет:

"^(-?)(0|([1-9][0-9]*))(\\.[0-9]+)?$" 

где: "(. \ [0-9] * [1-9])?"

1. is an optional negative sign; 
2. is zero or a valid non-zero integer; 
4. is the optional fracture part; 

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

printf("%.1f", x); 

так легко может заканчиваться нулевым символом. и, конечно же, это все фиксированные точки, а не сами двойники. двойной номер может быть записан как -1.23e-4, а вместо -0.000123.