Упражнение по регулярному выражению

#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).

Надеюсь, это должно вам помочь.