Что такое хорошее регулярное выражение для обработки числа с плавающей точкой (т.е. как Плавание 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
Таким образом, это должно
Для тех, кто задается вопросом, да, это - проблема домашней работы. Мы получили это как присвоение в моем выпускнике класс CS на компиляторах. Я уже повернулся в своем ответе для класса и отправлю его как ответ на этот вопрос.
[Эпилог] Мое решение не получило полный кредит, потому что это не обработало больше чем 1 цифру слева от десятичного числа. Присвоение действительно упоминало, что обработало плавания Java даже при том, что ни один из примеров не имел больше чем 1 цифру слева от десятичного числа. Я отправлю принятый ответ в своем собственном сообщении.
[Это ответ профессора]
Определите:
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)
для формирования результата выражения. Хотя я уверен, что математики могут оспорить этот момент, помните, что это из лекции по синтаксическому анализу.
Просто сделайте и десятичную точку, и часть E-затем-экспоненты необязательными:
[1-9][0-9]*\.?[0-9]*([Ee][+-]?[0-9]+)?
Я не понимаю, почему вы не хотите, чтобы ведущий [+ -]?
также фиксировал возможный знак, но, неважно! -)
Отредактируйте : на самом деле может не быть цифр после десятичной точка (в этом случае, я полагаю, там должна быть десятичная точка и 1+ цифр после нее!), поэтому вертикальная черта (альтернатива) явно необходима:
(([1-9][0-9]*\.?[0-9]*)|(\.[0-9]+))([Ee][+-]?[0-9]+)?
Вот что я сдал.
(([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)