2010-01-22 2 views
1

Я пробовал 2 вопроса, не могли бы вы сказать мне, прав я или нет?Регулярные выражения для целочисленных констант и для двоичных чисел

  1. Регулярное выражение неотрицательных целочисленных констант в C, где номера, начинающиеся с 0 являются восьмеричной константы и другие числа являются десятичные константы.

    Я пробовал 0([1-7][0-7]*)?|[1-9][0-9]*, правильно? И какую строку я могу совместить? Как вы думаете, 034567 будет соответствовать и 000083 матч?

  2. Что такое регулярное выражение для двоичных чисел х такое, что ч х + я х = у х?

Я попытался (0|1){32}|1|(10)).. вы думаете, строка как 10 будет соответствовать и 11 не будет соответствовать?

Пожалуйста, скажите мне, прав я или нет.

+0

Я считаю, что '0000047' является действительным восьмеричным литералом. – kennytm

+0

Также вы можете найти регулярное выражение '077777777777777777777777777777777777777777777'. Это компилируется, но он дает предупреждение: «целочисленная константа слишком велика для своего типа». –

+0

Но если начальное значение 0 означает восьмеричное, будет ли значение, подобное 07777, считаться отрицательным 12-битным числом (в смысле дополнения 2-го уровня)? Если 034567 - это 15-битное число и 000083 другое, оба являются положительными, потому что MSB равен нулю. Я не смотрю на ваши регулярные выражения, здесь: они слишком сложны для меня. Они выглядят не так. – pavium

ответ

1

Ваше регулярное выражение для целочисленных констант не будет соответствовать номерам оснований-10 длиннее двух цифр и восьмеричных чисел длиннее трех цифр (2, если вы не считаете начальный ноль). Поскольку это домашнее задание, я оставляю это вам, чтобы понять, что с ним не так.

Подсказка: Google для «кванторов повторения регулярных выражений».

1
  1. 0([1-7][0-7])?|[1-9][0-9] не так, потому что повторений нет - он будет соответствовать только 1 или 2 символам. То, что вам нужно, это что-то вроде 0[0-7]*|[1-9][0-9]*, хотя это не учитывает шестнадцатеричные (в соответствии со спецификацией).
  2. Это непонятно. Не могли бы вы перефразировать это или дать еще несколько примеров?
+0

Привет, Макс, как ты пришел к этому ответу, мог бы и бросить какой-то свет? – user256415

+0

Это довольно просто. Есть основные | ветвь между восьмеричным слева и десятичным справа. Октал начинается с нуля, после чего следует любое количество цифр от 0 до 7. Десятичные значения совпадают с вашим исходным регулярным выражением. –

+0

должно быть еще [1-7] перед [0-7] *? – user256415

2

Вы всегда можете использовать http://www.spaweditor.com/scripts/regex/ для быстрого тестирования того, работает ли определенное регулярное выражение так, как вы его намереваетесь. Это вместе с Google поможет вам прибить нужное вам регулярное выражение.

0

Макс ответил на первый вопрос.

второе представляется неразрешимым диофантовым уравнением последней теоремы Ферма. если H, I, J являются ненулевых целых чисел, х может быть только 1 или 2, так что вы ищете

^0*10?$ 

это поможет?

+0

, но jspcal - это мой ответ на второй ((0 | 1) {32} | 1 | (10)) правильный? – user256415

+0

его удалить первый член '(0 | 1) {32} |' должен работать ... (preend 0 *, если вы хотите сопоставить строки типа «000001», и вам нужно будет привязать шаблон (^ $) – jspcal

0

Существует несколько инструментов для тестирования регулярных выражений, таких как The Regulator.

Если вы ищете «тест регулярных выражений», вы найдете множество ссылок на онлайн-тестеры.

1

Вопрос 1:

Восьмеричные номера:

Строка, которые начинаются с [0], а затем может следовать любой цифрой 1, 2, .. 7 [1-7 ] (при отсутствии начальных нулей), но также может содержать нули после первой фактической цифры, поэтому [0-7] * (* для повторения, ноль или более).

Таким образом, мы получаем следующую RegEx для этой части: 0 [1-7] [0-7] *

Десятичные числа:

Десятичные числа не должны иметь ведущий нуль, следовательно, начать со всеми цифрами от 1 до 9 [1-9], но нули допустимы и во всех других положениях, поэтому нам необходимо конкатенировать [0-9] *

Итак, для этой части мы получаем следующий регрессивный код: [1 -9] [0-9] *

Поскольку у нас есть t wo (восьмеричные и десятичные числа), и один из них возможен, мы можем использовать свойство Alternation '|' :

L = 0 [1-7] [0-7] * | [1-9] [0-9] *

Вопрос 2:

Быстро глядя на Великая теорема Ферма:

В теории чисел, Великая теорема Ферма (иногда называемая гипотеза Ферма , особенно в старых текстах) утверждает, что никакие три положительных целых числа a, b и c не могут удовлетворять уравнению an + bn = cn для любого целого значения n больше двух. (http://en.wikipedia.org/wiki/Fermat%27s_Last_Theorem)

Следовательно следующие множества где п = 2 < удовлетворяют уравнение: {0,1,2} base10 = {0,1,10} base2

Если какие-либо из этих элементов удовлетворяет уравнение, мы используем Alternation | (или)

Таким образом, регулярное выражение может быть: L = 0 | 1 | 10, но также может быть L = 00 | 01 | 10 или даже L = 0 | 1 | 10 | 00 | 01

Или может быть обобщена на:

  1. {0} мы можем иметь бесконечное число нулей: 0 *
  2. {1} мы можем иметь бесконечное число нулей, за которыми следует 1: 0 * 1
  3. {10} мы можем иметь бесконечное число нулей, затем 10: 0 * 10

Так L = 0 * | 0 * 1 | 0 * 10

+0

Пожалуйста, объясните свой ответ! – Rizier123

+0

добавил некоторое объяснение! –

Смежные вопросы