Ваша задача - создать программу, которая определяет, является ли данная строка допустимым регулярным выражением или не использует фрагменты кода, полученные из сайтов в сети StackExchange.
Для целей этой задачи, регулярное выражение говор будет урезанная и в основном минимальный набор мета-символов: ()*?|\
. Таким образом, вы не сможете использовать встроенные парсеры регулярных выражений.
\
используется для экранирования метасимволов. За ним должен следовать метасимвол.- Неэкранированные скобки должны быть сбалансированы
*
и?
должен предшествовать либо не-метасимвол, либо группа в скобках, либо экранированный метасимвол.- Все другие печатаемые символы ASCII, а также символы новой строки, табуляции и пробела должны поддерживаться как неметачные символы. Что происходит со строкой, содержащей другие символы, не определено.
- Фактическое значение регулярного выражения не имеет значения для этой задачи.
Примеры
Truthy:
abc
a?
(a|)*
()
a|b*
\*
\\
\\*
a*b?(cd|e)
+
[
}
(123\))*
\|
(a(b(c|d)*e)*f)*
(|\)*)
(abc)+*
(abc)+
+abc
^ last test case is an actual newline
Falsy:
?abc
*
**
\
(
a*?
a?*
?
a)
(\)
(|\)*
\()
|*
(?:abc)
\\**
\n
счет
Ваш общий балл - это количество фрагментов, взятых из вопросов и ответов вокруг StackExchange.
- Повторные фрагменты учитываются столько раз, сколько они используются.
- Пробелы могут быть добавлены и удалены свободно (из-за Python, Haskell и других языков, чувствительных к пробелам) и не учитываются при подсчете количества фрагментов.
- Исключением будет, если ваш код действительно написан в Whitespace .
- Фрагменты разрешены с любого сайта StackExchange, если они исходят из более старых вопросов, ответов и комментариев (в том числе по времени редактирования - при необходимости используйте более старые ревизии), чем это испытание. (24 сентября 2019 г., 15:30 по Гринвичу)
- Фрагменты могут поступать из любого места в теле вопроса, ответа или комментария, независимо от того, находится ли он в предварительно отформатированном блоке кода или нет.
- Соединение фрагмента в середине другого приводит к тому, что внешний фрагмент считается как два фрагмента.
Самый низкий балл побеждает!
Ответы:
Perl 6 , 20 фрагментов
Попробуйте онлайн!
Фрагменты взяты из:
{$_ eq
,m/[
,<-[
,()*?
,|\\
,]>
,|\\
,<[
,()*?
,|\\
,]>
,|
,'(' <~~>* ')'
,<[
,*?
,]>
,?|
,\|
,]+/
,}
.В основном это жадный подход (очевидный для всех фрагментов из одного или двух символов). Я использовал SymbolHound для поиска отдельных символов, и единственной реальной оптимизацией был
'(' <~~>* ')'
фрагмент, который взят из моего собственного ответа на рекурсивные регулярные выражения Perl 6.Объяснение:
Это в основном проверяет, равен ли ввод жадному совпадению действительного регулярного выражения. Причина, по которой мы не можем просто использовать само регулярное выражение и добавить его
^$
для обозначения концов, заключается в том, что мы используем рекурсивное регулярное выражение, которое не сработало бы, если бы были^$
маркеры. Само регулярное выражение:источник
~~
, спасибо!~~
что не появляется, потому что это еще не полностью осуществлено (например<~~0>
), хотя там есть другие скрытые драгоценные камни.