- Сообщения
- 4,020
- Репутация
- 626
Гуру регэкспов (не будем тыкать пальцАми)
Подскажите, как можно посредством регулярных выражений распознать является ли строка условным комплексным числом.
Поясняю:
Комплексное число - это пара действительных чисел, алгебраическая запись которых может быть представлена в виде
где i - это мнимая единица (всегда обозначается как i)
Мне бы хотелось, чтобы скрипт мог распознавать подобные числа.
Например
5[,.]1 + 2[,.]1[*_x][ij] - да
5[,.] + 2[,.][*_x][ij] - да
5 + 2[*_x][ij] - да
5 + 2[ij] - да
[a-z] + ... - нет
... + [a-z]... - нет
присутствие любых символов кроме цифр, точки/запятой (как разделитель целой и дробной части), знаков *, _, х (разделитель мнимой части от мнимой единицы) - нет
Для этих целей я соорудил следующую конструкцию
Как можно заметить, если все нормально, то строка более-менее похожая на комплексное число приобретает вид
Только у меня случился затык, когда я начал тестить на строках типа 5.11.11 - то есть множественные разделители целой и дробной части, и 5.11 1, когда есть пробел между цифрами которые сливаются после удаления всех пробелов - они проходят проверку.
Подскажите, как же все такие реализовать подобный финт?
Спасибо
PS: регэкспами занялся только сегодня, поэтому приму любой совет по оптимизации
Подскажите, как можно посредством регулярных выражений распознать является ли строка условным комплексным числом.
Поясняю:
Комплексное число - это пара действительных чисел, алгебраическая запись которых может быть представлена в виде
Код:
z = a + bi
Мне бы хотелось, чтобы скрипт мог распознавать подобные числа.
Например
5[,.]1 + 2[,.]1[*_x][ij] - да
5[,.] + 2[,.][*_x][ij] - да
5 + 2[*_x][ij] - да
5 + 2[ij] - да
[a-z] + ... - нет
... + [a-z]... - нет
присутствие любых символов кроме цифр, точки/запятой (как разделитель целой и дробной части), знаков *, _, х (разделитель мнимой части от мнимой единицы) - нет
Для этих целей я соорудил следующую конструкцию
Код:
$a = ' 5 . 1 + 2,4 * j '; Исходная строка
$b = StringRegExpReplace($a, '\s', ''); Удаляем все пробелы
$pattern = '\d+[\.,\d*]?[^\.]?\+\d+[\.,]?\d*[_\*x][ij]'; Паттерн
If StringRegExp($b, $pat) Then
$c = StringReplace($b, ',', '.'); Заменяем все запятые, если есть, на точки
$d = StringRegExpReplace($c, '[x\*_]', ''); Удаляем все разделители мнимой части, если есть
$e = StringRegExpReplace($d, '\.\+', '+'); Если есть точки без дробной части, удаляем такие точки
$f = StringRegExpReplace($e, 'j', 'i'); Заменяем j на i (если был задан такой формат мнимой единицы)
MsgBox(0, '', $b & @CRLF & $c & @CRLF & $d & @CRLF & $e & @CRLF & $f); Вывод результата на экран
Else
MsgBox(0, '', 'Nope'); Если строка не подходит
EndIf
Как можно заметить, если все нормально, то строка более-менее похожая на комплексное число приобретает вид
Код:
a[.b] + c[.d]i
Подскажите, как же все такие реализовать подобный финт?
Спасибо
PS: регэкспами занялся только сегодня, поэтому приму любой совет по оптимизации