#regex #regular-language
#регулярное выражение #обычный язык
Вопрос:
L= { w is {1,2,3}*
| w starts with 3, ends with 2 and there is a substring of only 1 with length
even equal or >2}.
Таким образом, результат некоторых тестов должен быть:
3323112: accepted
311211112: non accepted
31112: non accepted
32: non accepted
2113: non accepted
313212: non accepted
Мой ответ : 3*(11)*2*
Но некоторые тесты не выполняются… Кто-нибудь может мне помочь?
2-е упражнение :
L= { w is {1,2}*
| in w after every 1 there is one or more 2, but if the 1 is the last
character it could be the last (no 2 after it)}
Тестовые строки:
1: accepted
222: accepted
221212122: accepted
1222121: accepted
111221: not accepted
11: not accepted
Мое решение (12*)*
Но некоторые тесты не выполняются… Помогите мне, пожалуйста.
Комментарии:
1. Я подозреваю, что этот вопрос относится к теоретической информатике
2. Почему
311211112
отклоняется в первом упражнении? Он удовлетворяет всем перечисленным вами условиям (начинается с 3, заканчивается на 2 и содержит последовательность из 1 с четной длиной).
Ответ №1:
Поскольку это похоже на домашнее задание, я не собираюсь давать прямой ответ. Вам нужно будет изучить модификаторы в регулярных выражениях. *
обозначает повторение 0 или более раз. Есть также
, ?
и квадратные скобки для классов символов. Также обратите внимание, что некоторые доступные материалы могут зависеть от используемого вами анализатора регулярных выражений (часто называемого «flavor»). Но некоторые основы, как правило, одни и те же.
Удачи вам!
Ответ №2:
- Начинается с 3:
^3
- Заканчивается на 2:
2$
- Содержит последовательность, состоящую как минимум из двух единиц:
1{2,}
- Результирующее регулярное выражение:
^3[1-3]*1{2,}[1-3]*2$
([1-3]*
фрагменты допускают любые цифры от 1 до 3, поскольку там нет никаких требований) - РЕДАКТИРОВАТЬ: я думаю, что я неправильно понял условие о единицах,
поэтому шаблон для этого таков:(?<!1)(1{2}) (?!1)
(посмотрите назад и посмотрите вперед, чтобы убедиться, что единицы изолированы) - Пересмотренный шаблон:
^3[1-3]*(?<!1)(1{2}) (?!1)[1-3]*2$
- После каждого 1 есть хотя бы один 2:
(?<!1)12
(убедитесь, что перед этим нет 1) - В последнем 1 может не быть 2 после:
1?$
- Результат:
^((?<!1)12 )*1?$
Надеюсь, это поможет. Удачи с регулярными выражениями, их сложно выучить, но легко, как только вы освоитесь.
Комментарии:
1. Возможно, я неправильно понял условие о единицах. Означает ли это, что последовательность единиц должна иметь длину, равную четному числу?
2. @Kolink Вот как я это интерпретировал. Я думаю, что это должно быть поровну, да.
3. В вопросе говорится: «подстрока только 1 с четной длиной».
Ответ №3:
Я не собираюсь делать за вас домашнее задание, но я укажу на несколько проблем с тем, что вы пытаетесь сделать:
- Звезда сама по себе не является шаблоном. Это не означает «сопоставлять что-либо». Это квантификатор, который изменяет предыдущий токен. Вы хотите использовать
.*
вместо*
, чтобы разрешить любое количество любых символов. - Выражение
.*(11)*.*
также сопоставляет строки с нечетным числом 1s, поскольку также.
может быть единицей. Цифра непосредственно перед и после единиц должна быть «не-1» (т.Е. 2 или 3).
Надеюсь, это должно вам помочь.