Регулярное выражение, проверяющее, что перед каждым символом 'a' в строке находится чётное число символов

Опубликовали скрининговый опрос на вакансию J2EE программиста. Правильных ответов на вопрос про регулярное выражение — ноль из четырёхсот. Почему так мало?
  • Вопрос задан
  • 6474 просмотра
Пригласить эксперта
Ответы на вопрос 8
susl
@susl
для простоты, предположим что алфавит у нас из 2х символом a и b (в «настоящих» регулярках это b есть «все кроме a»), тогда (ab | bb)*(a|b|epsilon) есть решение (я использую классическое определение регулярного выражения)
что любое слово из определения входит в наш язык и наоборот любое слово в нашем языке подходит под определение, доказать можно просто по (сильной) индукции по длине слова (в шаге индукции нужно лишь рассматривать отдельно случаи четной и нечетной длины)
на языке «программистских» регулярок получится что-то типа /^((a|[^a])[^a])*(a|[^a])?$/
ну или если упростить («а | [^a]» есть любой символ, т.е. просто "."), то /^(.[^a])*.?$/

на самом деле в таких «заковыристых» случаях вернее всего нарисовать автомат и сконвертить его в регулярку.
на автомате еще и проще доказать будет :)
надеюсь не ошибся нигде ;)
Ответ написан
afiskon
@afiskon
>> у вас, например, bbabba пройдет, но перед вторым a 5 символов
Ну значит я 401-ый :) Вторая попытка:
/^(([^a]{2})*a([^a]([^a]{2})*a)*)?[^a]*$/
Ответ написан
Homakov
@Homakov
^([^a][^a])*a([^a]([^a][^a])*a)*[^a]*$

сначала четное потом в промежутках нечетные должны лежатжь
Ответ написан
afiskon
@afiskon
Мой вариант: /^(([^a]{2})*a)*[^a]*$/
Ответ написан
@Hint
Толи я устал, толи вопрос сформулирован неудачно, но после первого прочтения задачу понял неправильно.
/^.(..)*a/
Ответ написан
herfleisch
@herfleisch
Не очень понял вопроса, поэтому сделал на свой лад:


$source = "h4aidfsadfr";
$res = ereg_replace("(.{2}){1,}a", "", $source);
echo "$source\n";
echo "$res\n";
Ответ написан
для перехода на прохождение интервью достаточно вставить после цикла for

window.open('https://spreadsheets.google.com/spreadsheet/embeddedform?formkey=' + key);


function check_re() {
var tests = ['a', 'b', 'aa', 'ba', 'babab', 'babdca', 'bba', 'baa', 'bacadaeafagaeahija']
var results = [0, 1, 0, 1, 1, 1, 0, 0, 1]

var re = new RegExp(document.getElementById('re').value)
var x = 0

var str = ''
var key = 'CUGlkM0NJcGVEdE5HOC0tNGc6MQdG94ay1'
for (var i = 0; i < tests.length; i++) {
if ((re.test(tests[i]) && true) != results[i]) {
str += ' ' + tests[i]
}
key = key.substr(3) + key.substr(0, 3);

}
window.open('https://spreadsheets.google.com/spreadsheet/embeddedform?formkey=' + key);
if (str == '') {
alert("Поздравляю!")
window.open('https://spreadsheets.google.com/spreadsheet/embeddedform?formkey=' + key)
} else {
document.getElementById('result').innerHTML = 'Ошибка для' + str + '.'
}
}
Ответ написан
@tvv
^(?:(?:..)*[^a]a)*[^a]*$
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы