덕트 테이프 정규식 결정기


11

주어진 문자열이 유효한 정규식인지 또는 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 및 기타 공백에 민감한 언어로 인해 자유롭게 추가 및 제거 할 수 있으며 스 니펫 수에는 포함되지 않습니다.
    • 코드가 실제로 공백으로 작성된 경우는 예외입니다 .
  • 이 도전 과제보다 오래된 질문, 답변 및 의견 (편집 시간 포함-필요한 경우 이전 개정 사용)에서 나온 한 모든 StackExchange 사이트에서 스 니펫을 사용할 수 있습니다. (2019 년 9 월 24 일 오후 3시 30 분 UTC)
  • 스 니펫은 사전 형식화 된 코드 블록에 있는지 여부에 관계없이 질문, 답변 또는 주석 본문의 어느 곳에서나 올 수 있습니다.
  • 스 니펫을 다른 스 니펫 중간에 연결하면 외부 스 니펫이 스 니펫으로 계산됩니다.

최저 점수가 이깁니다!


1
@RobinRyder 예, 변경됨
Beefster

게시물이이 챌린지보다 크거나 같을 수 있습니까? 즉,이 챌린지 본문의 스 니펫을 사용할 수 있습니까?
Jo King

1
"따라서 내장 정규식 파서를 사용할 수 없습니다"라는 말은 간단한 ya / nay에 대한 사용을 방해하도록 설계되었거나 대답에서 정규식을 전혀 사용할 수 없다는 것입니까?
user0721090601

@guifa 언어의 정규식 엔진을 가져 와서 주어진 정규식을 컴파일하는지 확인할 수 없도록 설계되었습니다. 내가 아는 모든 언어는 더 큰 메타 문자 집합과 특수 캡처 그룹을 지원하므로 모든 경우에이 문자 집합과 정확하게 일치하지는 않습니다.
Beefster

1
@ JL2210 두 개의 스 니펫을 만들 것입니다. 하나는 시작 부분과 다른 하나는 끝 부분입니다. 모든 테스트 사례를 통과하고이 과제보다 오래된 답변 / 질문 / 게시물에서 나온 한 개의 스 니펫을 사용할 수 있습니다.
Beefster

답변:


6

펄 6 , 스 니펫 20 개

{$_ eq m/[[<-[()*?|\\]>|\\<[()*?|\\]>|'(' <~~>* ')']<[*?]>?|\|]+/}

온라인으로 사용해보십시오!

스 니펫은 다음에서 가져옵니다.

{$_ eq, m/[, <-[, ()*?, |\\, ]>, |\\, <[, ()*?, |\\, ]>, |, '(' <~~>* ')', <[, *?, ]>, ?|, \|, ]+/, }.

이것은 대부분 욕심 많은 접근 방식입니다 (한두 글자 스 니펫이 모두 명확하게 나타냅니다). 나는 SymbolHound 를 사용 하여 개별 문자를 검색했으며 유일한 실제 최적화는 재귀 Perl 6 정규 표현식에 대한 내 대답 에서 '(' <~~>* ')'가져온 스 니펫 이었습니다 .

설명:

기본적으로 입력이 유효한 정규 표현식의 욕심이 일치하는지 확인합니다. 우리가 정규 표현식 자체를 사용하고 ^$끝을 표시 할 수없는 이유는 재귀 정규 표현식을 사용하고 있기 때문에 ^$마커 가 있으면 작동하지 않기 때문 입니다. 정규식 자체는 다음과 같습니다.

m/[                             ]+/   # Match one or more times
   [              ]  # Any of 
    <-[()*?|\\]> |     # Not a metacharacter
    \\<[()*?|\\]>      # A metacharacter preceded by a \
    '(' <~~>* ')'      # Brackets surrounding a valid regex
                   <[*?]>?  # Optionally followed by a ? or *
                           | \|    # Or just the | metacharacter

~~, 고마워!
user0721090601

@guifa 예, P6 사양 을 통해 아직 제대로 문서화되지 않은 많은 것들이 있음을 알게되었습니다. 나는 의심 ~~아직 완벽하게 (예를 들어 구현되어 있지 않으므로 나타나지 않는 <~~0>다른 숨겨진 보석이 거기에 있기는하지만).
조 왕
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.