Регулярное выражение упражнение

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*

Но некоторые тесты не пройдут... Кто-нибудь может мне помочь?

Второе упражнение:

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*)*

Но это не проходит некоторые испытания... Помогите мне, пожалуйста.

3 ответа

Я не собираюсь делать вашу домашнюю работу за вас, но я укажу несколько проблем с тем, что вы пытаетесь сделать:

  • Звезда сама по себе не является подстановочным знаком. Это не значит "соответствовать чему-либо". Это квантификатор, который изменяет предыдущий токен. Вы хотите использовать .* вместо * разрешить любое количество любых символов.
  • Выражение .*(11)*.* также сопоставляет строки с нечетным числом 1, потому что . также может быть один. Цифра непосредственно перед и после 1 должна быть "not-a-1" (то есть 2 или 3).

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

Поскольку это похоже на домашнее задание, я не буду давать прямой ответ. Вы захотите посмотреть на модификаторы в регулярных выражениях. * обозначает повторение 0 или более раз. Есть также +, ? и квадратные скобки для классов персонажей. Также обратите внимание, что некоторые вещи, которые доступны, могут зависеть от используемого вами синтаксического анализатора регулярных выражений (часто называемого "аромат"). Но некоторые основы обычно одинаковы.

Удачи!

  • Начинается с 3: ^3
  • Заканчивается на 2: 2$
  • Содержит последовательность не менее двух единиц: 1{2,}
  • Результирующее регулярное выражение: ^3[1-3]*1{2,}[1-3]*2$ ([1-3]* штуки позволяют вводить цифры от 1 до 3, поскольку там нет никаких требований)
  • РЕДАКТИРОВАТЬ: Я думаю, что я неправильно понял условие о 1s,
    поэтому шаблон для этого: (?<!1)(1{2})+(?!1) (смотреть назад и смотреть вперед, чтобы убедиться, что 1s изолированы)
  • Пересмотренный образец: ^3[1-3]*(?<!1)(1{2})+(?!1)[1-3]*2$

  • После каждого 1 есть хотя бы один 2: (?<!1)12+ (убедитесь, что до этого нет 1)
  • Финальная 1 может не иметь 2 после: 1?$
  • Результат: ^((?<!1)12+)*1?$

Надеюсь это поможет. Удачи с регулярными выражениями, их трудно выучить, но легко, когда вы освоите их.

Другие вопросы по тегам