Как обнаружить число с плавающей точкой с помощью регулярного выражения

Что такое хорошее регулярное выражение для обработки числа с плавающей точкой (т.е. как Плавание Java)

Ответ должен соответствовать против следующих целей:

 1) 1.  
 2) .2   
 3) 3.14  
 4) 5e6  
 5) 5e-6  
 6) 5E+6  
 7) 7.e8  
 8) 9.0E-10  
 9) .11e12  

Таким образом, это должно

  • проигнорируйте предыдущие знаки
  • потребуйте, чтобы первый символ слева от десятичной точки был ненулевым
  • позвольте 0 или больше цифр по обе стороны от десятичной точки
  • разрешите число без десятичной точки
  • позвольте экспоненциальное представление
  • позвольте капитал или нижний регистр 'e'
  • позвольте положительные или отрицательные экспоненты

Для тех, кто задается вопросом, да, это - проблема домашней работы. Мы получили это как присвоение в моем выпускнике класс CS на компиляторах. Я уже повернулся в своем ответе для класса и отправлю его как ответ на этот вопрос.

[Эпилог] Мое решение не получило полный кредит, потому что это не обработало больше чем 1 цифру слева от десятичного числа. Присвоение действительно упоминало, что обработало плавания Java даже при том, что ни один из примеров не имел больше чем 1 цифру слева от десятичного числа. Я отправлю принятый ответ в своем собственном сообщении.

14
задан Johan Råde 23 October 2012 в 05:33
поделиться

4 ответа

[Это ответ профессора]

Определите:

N = [1-9]
D = 0 | N
E = [eE] [+-]? D+
L = 0 | ( N D* )

Тогда числам с плавающей точкой можно поставить в соответствие:

( ( L . D* | . D+ ) E? ) | ( L E )

Также допустимо использовать D+ вместо L и добавлять [+-]?

Частой ошибкой было написание D* . D*, но это может соответствовать просто '.'.

[Edit]
Кто-то спросил о ведущем знаке; я должен был спросить его, почему он исключен, но не успел. Поскольку это было частью лекции по грамматикам, я предполагаю, что либо это облегчило задачу (маловероятно), либо в синтаксическом разборе есть небольшая деталь, когда вы делите набор задач так, что значение с плавающей точкой, независимо от знака, находится в центре внимания (возможно).

Если вы разбираете выражение, например,

-5.04e-10 + 3.14159E10

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

вычесть (5.04e-10)

прибавить (3.14159E10)

для формирования результата выражения. Хотя я уверен, что математики могут оспорить этот момент, помните, что это из лекции по синтаксическому анализу.

7
ответ дан 1 December 2019 в 06:53
поделиться

Просто сделайте и десятичную точку, и часть E-затем-экспоненты необязательными:

[1-9][0-9]*\.?[0-9]*([Ee][+-]?[0-9]+)?

Я не понимаю, почему вы не хотите, чтобы ведущий [+ -]? также фиксировал возможный знак, но, неважно! -)

Отредактируйте : на самом деле может не быть цифр после десятичной точка (в этом случае, я полагаю, там должна быть десятичная точка и 1+ цифр после нее!), поэтому вертикальная черта (альтернатива) явно необходима:

(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)?
23
ответ дан 1 December 2019 в 06:53
поделиться

Вот что я сдал.

(([1-9]+\.[0-9]*)|([1-9]*\.[0-9]+)|([1-9]+))([eE][-+]?[0-9]+)?

Чтобы было легче обсуждать, я обозначу разделы

( ([1-9]+ \. [0-9]* ) | ( [1-9]* \. [0-9]+ ) | ([1-9]+))  ( [eE] [-+]? [0-9]+ )?     
--------------------------------------------------------  ----------------------    
                           A                                       B

A: соответствует всему вплоть до 'e/E'
B: соответствует научной нотации

Разбирая A, мы получаем три части

 ( ([1-9]+ \. [0-9]* ) | ( [1-9]* \. [0-9]+ ) | ([1-9]+) )
   ----------1----------   ---------2----------   ---3----

Часть 1: Позволяет 1 или более цифр от 1-9, десятичная дробь, 0 или более цифр после десятичной дроби (цель 1)
Часть 2: Допускает 0 или более цифр от 1-9, десятичная дробь, 1 или более цифр после десятичной дроби (цель 2)
Часть 3: Разрешает 1 или более цифр от 1-9 без десятичной дроби (см. #4 в списке целей)


Разбивая B, мы получаем 4 основные части

 ( [eE] [-+]? [0-9]+  )?   
   ..--1- --2-- --3--- -4- .. 

Часть 1: требует верхнего или нижнего регистра 'e' для научной нотации (например, цели 8 и 9)
Часть 2: допускает необязательный положительный или отрицательный знак для экспоненты (например, задачи 4, 5 и 6)
Часть 3: позволяет использовать 1 или более цифр для экспоненты (цель 8)
Часть 4: позволяет использовать научную нотацию как группу (цель 3)

3
ответ дан 1 December 2019 в 06:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: