정규식 골프 : 스도쿠 솔루션 확인


65

유효한 스도쿠 솔루션과 일치하고 유효하지 않은 스도쿠 솔루션과 일치하지 않는 정규식을 작성하십시오 . 입력은 스도쿠 의 롤링되지 않은 버전입니다. 즉 줄 구분 기호가 없습니다. 예를 들어 다음 보드 :

7 2 5 8 9 3 4 6 1
8 4 1 6 5 7 3 9 2
3 9 6 1 4 2 7 5 8
4 7 3 5 1 6 8 2 9
1 6 8 4 2 9 5 3 7
9 5 2 3 7 8 1 4 6
2 3 4 7 6 1 9 8 5
6 8 7 9 3 5 2 1 4
5 1 9 2 8 4 6 7 3

다음과 같이 주어질 것입니다 :

725893461841657392396142758473516829168429537952378146234761985687935214519284673

규칙은 아마도 지금까지는 일반적인 지식이지만 아마도 다음과 같은 경우에만 스도쿠 보드가 유효합니다.

  • 각 행에서 숫자를 포함 19정확히 한 번만.
  • 각 열에서 숫자를 포함 19정확히 한 번만.
  • 아홉 3 × 3 subgrids 각각에서 숫자를 포함 19정확히 한 번만.

규칙

답은 추가 코드가없는 단일 정규식으로 구성되어야합니다 (선택적으로 솔루션 작동에 필요한 정규식 수정 자 목록 제외). 호스팅 언어로 코드를 호출 할 수있는 언어 정규식 기능 (예 : Perl e수정 자)을 사용해서는 안됩니다 .

이 도전 전에 존재했던 정규식 풍미를 사용할 수 있지만, 풍미를 지정하십시오.

정규식이 암시 적으로 고정되어 있다고 가정하지 마십시오. 예를 들어 Python을 사용하는 경우 정규 표현식을와 함께 사용하고 사용 re.search하지 않는다고 가정하십시오 re.match. 정규식이 전체 문자열과 일치하지 않아도됩니다. 유효한 솔루션의 경우 적어도 하나의 하위 문자열 (비어있을 수 있음)과 일치해야하며 유효하지 않은 솔루션과 일치하지 않습니다.

입력이 항상 81 양수의 문자열이라고 가정 할 수 있습니다.

이것은 정규식 골프이므로 바이트 단위의 가장 짧은 정규식이 이깁니다. 언어에서 /.../정규식을 나타 내기 위해 구분 기호 (일반적으로 )가 필요한 경우 구분 기호 자체를 계산하지 마십시오. 솔루션에 수정자가 필요한 경우 수정 자당 1 바이트를 추가하십시오.

테스트 사례

유효한 보드 :

123456789456789123789123456231564897564897231897231564312645978645978312978312645
725893461841657392396142758473516829168429537952378146234761985687935214519284673
395412678824376591671589243156928437249735186738641925983164752412857369567293814
679543182158926473432817659567381294914265738283479561345792816896154327721638945
867539142324167859159482736275398614936241587481756923592873461743615298618924375
954217683861453729372968145516832497249675318783149256437581962695324871128796534
271459386435168927986273541518734269769821435342596178194387652657942813823615794
237541896186927345495386721743269158569178432812435679378652914924813567651794283
168279435459863271273415986821354769734692518596781342615947823387526194942138657
863459712415273869279168354526387941947615238138942576781596423354821697692734185
768593142423176859951428736184765923572389614639214587816942375295837461347651298
243561789819327456657489132374192865926845317581673294162758943735914628498236571
243156789519847326687392145361475892724918653895263471152684937436729518978531264
498236571735914628162758943581673294926845317374192865657489132819327456243561789
978531264436729518152684937895263471724918653361475892687392145519847326243156789
341572689257698143986413275862341957495726831173985426519234768734869512628157394

유효하지 않은 보드 :

519284673725893461841657392396142758473516829168429537952378146234761985687935214
839541267182437659367158924715692843624973518573864192298316475941285736456729381
679543182158926473432817659567381294914256738283479561345792816896154327721638945
867539142324167859159482736275398684936241517481756923592873461743615298618924375
754219683861453729372968145516832497249675318983147256437581962695324871128796534
271459386435168927986273541518734269769828435342596178194387652657942813823615794
237541896186927345378652914743269158569178432812435679495386721924813567651794283
168759432459613278273165984821594763734982516596821347615437829387246195942378651
869887283619214453457338664548525781275424668379969727517385163319223917621449519
894158578962859187461322315913849812241742157275462973384219294849882291119423759
123456789456789123564897231231564897789123456897231564312645978645978312978312645
145278369256389147364197258478512693589623471697431582712845936823956714931764825
243561789829317456657489132374192865916845327581673294162758943735924618498236571
243156789529847316687392145361475892714928653895263471152684937436719528978531264
498236571735924618162758943581673294916845327374192865657489132829317456243561789
978531264436719528152684937895263471714928653361475892687392145529847316243156789
342571689257698143986413275861342957495726831173985426519234768734869512628157394
345678192627319458892451673468793521713524986951862347179246835534187269286935714
341572689257698143986413275862341957495726831173985426519234768734869512628517394

추가 테스트 사례의 경우 유효한 CJA 스크립트사용 하여 유효한 보드를 입력으로 사용하고 임의로 임의의 순서로 섞어 새 유효한 보드를 제공합니다 (숫자 만 포함하고 공백이있는 경우 입력 형식과 무관).

정규식이 .NET 맛과 호환되는 경우 Retina를 사용하여 온라인으로 테스트 할 수 있습니다 . 유효한 솔루션은 0유효하지 않은 보드에 대해 인쇄 하고 유효한 보드에 대한 양의 정수를 인쇄해야합니다 . 모든 테스트 사례를 한 번에 실행하려면 이 템플릿을 사용 하고 두 번째 줄에 정규식을 삽입하십시오. 정규식 수정자가 필요한 경우 정규식 앞에 a `를 붙여 표준 수정 자 문자를 앞에 놓습니다.



1
이것 만이 [코드-볼링]이라면, lol.
mbomb007

잠깐만 ... 파이썬을 사용한다면 정규 표현식 사용할 수 있습니다 . 또한 각 보드는 얼마나 큽니까? 특정 크기가 있습니까? 그렇지 않다면 아래의 숫자에서 valid boards어떻게 각 보드를 추출해야 합니까?
R. Kap

@ R.Kap 어떤 풍미를 사용하든 관계없이 정규 표현식 (및 일부 수정 자) 만 제출해야합니다. 각 입력은 정확히 81 자리이며 전체 보드를 나타냅니다. (테스트 케이스의 각 라인은 별도의 보드입니다.)
Martin Ender

간단한 스도쿠를 SQL로 해결하는 스크립트를 작성했습니다. 이 질문에 대해 다시 쓸 수 있다고 확신합니다. 그러나 SQL에는 많은 REGEX가 없습니다. 그 대답이 실격됩니까? (스크립트는 아마도 400 자 미만일 것입니다.)
t-clausen.dk

답변:


40

루비 정규식, 71 78 73 바이트

^(?!.*(?=(.))(.{9}+|(.(?!.{9}*$))+|(?>.(?!.{3}*$)|(.(?!.{27}*$)){7})+)\1)

나는 루비를 모른다. 그러나 분명히 계단식 정량 자에 대해 불평하지 않는다.

여기에서 시도하십시오.

.NET 정규식, 79 78 75 또는 77 바이트

Martin은 이것이 가능하다고 생각하기 때문에 ... 그러나 그는 이러한 변화를 통합 할 것입니다.

^(?!(.)+((.{9})+|(?>(.{9})+
|.)+|(?((...)*
)(?>(.{27})+
|.){7}|.)+)(?<=\1))

입력에 후행 줄 바꿈이 필요합니다. 내가 이것을 할 수 있는지 확실하지 않습니다 (아마도).

여기에서 시도하십시오.

77 바이트 제정신 버전 :

^(?!(.)+((.{9})+|((?!(.{9})*$).)+|(?((...)*$)((?!(.{27})*$).){7}|.)+)(?<=\1))

이전 버전의 오류를 지적하고 1 바이트 ()를 골라냅니다 (...)*.

여기에서 시도하십시오.

PCRE, 77 78 바이트

^(?!.*(?=(.))((.{9})+|(.(?!(?3)*$))+|(?(?=.(...)*$)(.(?!(.{27})*$)){7}|.)+)\1)

완전성을 위해.

여기에서 시도하십시오.

또 다른 버전, 78 바이트 :

^(?!.*(?=(.))((.{9})+|(.(?!(?3)*$))+|(?>.(?!(...)*$)|(.(?!(.{27})*$)){7})+)\1)

여기에서 시도하십시오.

설명

^(?!.*                    # Match a string that doesn't contain the pattern,
                          # at any position.
  (?=(.))                 # Capture the next character.
  (
    (.{9})+               # Any 9*n characters. The next character is in
                          # the same column as the captured one.
  |
    (.(?!(.{9})*$))+      # Any n characters not followed by a positions 9*m
                          # to the end. The next character is in the same row
                          # as the captured one.
  |
    (                     # Any n occasions of...
    ?(.(...)*$)           # If it is at a position 3*k+1 to the end:
      (.(?!(.{27})*$)){7} # Then count 7*m characters that are not followed
                          # by a position 27*j to the end,
    |
      .                   # Else count any character.
    )+                    # The next character is in the same block as the
                          # captured one.
  )
  \1                      # Fail if the next character is the captured character.
)

와, 잘 했어 나는 그것을 .NET에서 83으로 가져 갔고 78로 PCRE로 전환해야했습니다. :)
Martin Ender

@ MartinBüttner Yep.
Nic Hartley

@ MartinBüttner를 (당시) 4 바이트만큼 이길 수있는 lookahead 사용이 깔끔하다고 생각했지만 다음 단계로 넘어갔습니다.
Neil

죄송하지만 (1, 2) 및 (2, 1)의 셀이 동일한 지 여부와 중복이 아래 왼쪽에있는 사각형의 다른 모든 셀에 대해서도 비슷하게 감지되지 않습니다.
Neil

1
@ MartinBüttner 방금 두 번째 PCRE 버전을 루비로 번역 할 수 있다는 것을 깨달았습니다. 지금 답변을 게시 할 수있을 것 같습니다 ...
jimmy23013

34

PCRE 117 119 130 133 147 바이트

^(?!(.{27})*(...){0,2}(.{9})?.?.?(.).?.?(?=(?2)*$).{6,8}(?3)?\4.{0,17}(?1)*$|.*(.)(.{8}(?3)*|((?!(?3)*$)(|.(?7))))\5)

파이썬, 자바 등의 풍미에서도 작동합니다. 이제 재귀와 함께! 그리고 "재귀"기능은 "서브 루틴"에 비재 귀적으로 사용되었으며, 실제 재귀를 사용해야 할 때까지 완전히 잊어 버렸습니다.


멋진 아이디어-짝사랑과 일치하는 대신 반복을 피하십시오!
Qwertiy

1
당신이 쓸 수없는 수치 .{27}*입니다.
Neil

Bah, 나는 133 바이트 솔루션을 121 바이트로 낮추어 다시 작성했다는 것을 알았지 만 여기에있다.^(?!(.{27})*(.{9})?(...){0,2}.?.?(.).?.?(?=(...)*$)(.{9})?.{6,8}\4.{0,17}(.{27})*$|.*(.)((.{9})+|((?!(.{9})*$).)+)(<=\8))
Neil

@ 닐 무슨 맛이야? 내가 알고있는 PCRE 또는 다른 사람들은 뒤돌아보기에서 역 참조를 허용하지 않습니다.
feersum

@Neil (<=\8)은 유효한 구문처럼 보이지 않습니다 (이 없습니다 ?). 또한 lookbehinds에서 역 참조를 지원하는 유일한 특징은 .NET입니다.
Martin Ender

15

.NET 정규식, 8339 바이트

그렇습니다. 마틴이 130 바이트처럼 해냈다 고 말했기 때문에 내 솔루션이 매우 순진하다는 것을 알고 있습니다. 실제로 온라인으로 시도하기위한 URL이 너무 길어서이를 수락 할 URL 단축기를 찾을 수 없습니다.

(code removed, since it's so long nobody will read it here, 
and it made the post take forever to load. Just use the "Try it online" link.)

아래 링크는 IE에서는 작동하지 않지만 Chrome 및 Firefox에서는 작동합니다.

온라인 시도 -!`바이트 수에 포함되지 않은 시작 부분의 도움으로 모든 테스트 사례를 한 번에 수행하십시오.


다음은 생성하는 데 사용한 Python 스크립트입니다 (아래 코드).

R=range(0,9)
S=range(1,10)

o = ""

# validate rows
T = "(?=.{%s,%s}%s)"
for j in R:
    for i in S:
        o += T % (9*j,9*(j+1)-1, i)

# validate columns
# "(?=(.{%s}|.{%s}|.{%s}|.{%s}|.{%s}|.{%s}|.{%s}|.{%s}|.{%s})%s)"
T = "(?=("+"|".join([".{%s}"]*9)+")%s)"
for j in R:
    for i in S:
        o += T % (j,j+9,j+18,j+27,j+36,j+45,j+54,j+63,j+72, i)

# validate boxes
# (?=.{0,2}1|.{9,11}1|.{18,20}1)(?=.{3,5}1|.{12,14}1|.{21,23}1)
# (?=.{27,29}1|.{36,38}1|.{45,47}1)
T = ".{%s,%s}%s"
for i in S:
    for x in (0,27,54):
        for y in (0,3,6):
            o += "(?="+"|".join(T % (x+y+z,x+y+z+2, i) for z in (0,9,18))+")"

o += ".{81}"

o = o.replace(".{0}","").replace(",80}",",}")
print(o)

1
응원합니다
Martijn

4
재미있는 게 뭔지 알아? 온라인 연결을 시도하면 IE가 너무 길기 때문에 IE에 충돌이 발생합니다. : P
cat

15
@cat 따라서 IE의 유일한 실제 목적은 사용자가 Firefox (또는 Chromium)를 다운로드하도록 허용하는 것입니다.
바이트 사령관

2
@cat Regex가 제대로 처리되지는 않지만 Windows 8.1에서는 IE11과 충돌하지 않습니다.
Nzall

2
@cat Windows 7에서 IE 11을 중단시키지 않습니다. URL이 잘립니다.
mbomb007

14

.NET 정규식, 121 바이트

^(?!(.{27})*(.{9})?(...){0,2}.?.?(.).?.?(?=(...)*$)(.{9})?.{6,8}\4.{0,17}(.{27})*$|.*(?=(.))((.{9})+|(.(?!(.{9})*$))+)\8)

설명:

^(?!                     Invert match (because we're excluding duplicates)
 (.{27})*                Skip 0, 3 or 6 rows
 (.{9})?                 Optionally skip another row
 (...){0,2}              Skip 0, 3 or 6 columns
 .?.?(.).?.?(?=(...)*$)  Choose any of the next three cells
 (.{9})?                 Optionally skip another row
 .{6,8}\4                Match any of the three cells below
 .{0,17}(.{27})*$        As long as they're from the same square
|                        OR
 .*(?=(.))(              Choose any cell
  (.{9})+                Skip at least one row
 |                       or
  (.                     Skip cells
   (?!(.{9})*$)          Without reaching the end of the row
  )+                     For at least one cell (i.e. the cell chosen above)
 )\8)                    Match the chosen cell to the next cell
)

행과 열의 조합은 매우 영리합니다. 그것은 내 자신의 솔루션에서 4 바이트를 절약합니다. :)
Martin Ender

8

PCRE, 3579 바이트

절대적으로 끔찍한 무력 솔루션. 부정적인 전망은 어이!

나는 이것을 포기하기 위해 너무 많은 시간을 보냈기 때문에, 후손을 위해 여기 있습니다.

밝은면에서 Sudoku가 갑자기 다른 9 문자 세트를 사용하기 시작하면 여전히 작동합니다.

http://pastebin.com/raw/CwtviGkC

Retina를 작동하는 방법을 모르지만 https://regex101.com 또는 이와 유사한 곳에 붙여 넣을 수 있습니다 .

정규식을 생성하는 데 사용되는 루비 코드 :

# Calculate the block you're in
def block(x)
    x /= 3
    x + x%3 - x%9
end

81.times do |i|
    row, col = i.divmod(9)
    neg = []
    neg += (0...col).map {|e| 9*row + e + 1}
    neg += (0...row).map {|e| 9*e + col + 1}
    neg += (0...i).map {|e| e + 1 if block(e) == block(i)}.compact
    neg = neg.uniq.sort.map {|e| "\\#{e}"}
    if neg.size > 0
        print "(?!#{neg.join '|'})"
    end
    print "(.)"
end

8

루비 맛, 75 74 바이트

1 바이트를 저장해 준 jimmy23013에게 감사합니다.

^(?!(.{9}*(.|(.)){,8}|.*(\g<2>.{8})*|.{27}?.{3}?(\g<2>{3}.{6}){,2}.?.?)\3).

여기에서 테스트하십시오.

드디어 구타되었으므로 내 솔루션을 공유 할 수 있습니다. :) 나는 프로세스 ( (.|(.)){,8}\3부분) 에서 흥미로운 (아마도 새로운?) 정규식 기술을 발견했습니다 .이 정규식의 다른 부분과 결합 할 수없는 경우에는 아마도 무적입니다 (jimmy23013의 답변에서와 같이) .

설명

다른 짧은 답변과 마찬가지로 행, 열 또는 블록에서 중복을 검색하는 네거티브 lookahead를 사용하고 있습니다. 솔루션의 기본 구성 요소는 다음과 같습니다.

(.|(.))...\3

가 있습니다 \3세 가지 다른 대안 사이에 재사용된다 (이 모든 사용 그룹 3중복 검출).

왼쪽의 해당 그룹 (group 2, group 포함 3)은 중복 숫자의 첫 번째 절반을 포함 할 수있는 위치 (중복 숫자를 포함하지 않아야하는 그룹 내)에 사용됩니다. 그런 ...다음 그러한 숫자가 발생할 수있는 다음 위치를 가져오고 (필요한 경우) \3역 참조를 통해 중복의 후반을 찾으려고하는 무언가입니다 . 이것이 작동하는 이유는 역 추적입니다. 엔진이 처음 일치 (.|(.))하면 .매번 사용 하고 아무 것도 캡처하지 않습니다. 이제 \3끝에서 실패합니다. 그러나 이제 엔진은 개별 경기 (.)대신 점차적으로 사용하려고 시도 .합니다. 궁극적으로 복제본이 있으면 조합을 찾을 수 있습니다.(.)복제본의 첫 번째 숫자에 마지막으로 사용 된 (나중에 캡처를 덮어 쓰지 않도록) 이후에 일부를 사용 .하여 간격을 역 참조에 연결합니다. 사본이 있으면 역 추적에서 항상 찾습니다.

이것이 사용되는 세 가지 다른 부분을 보자.

.{9}*(.|(.)){,8}

이것은 일부 행에서 중복을 확인합니다. 먼저로 행을 건너 뜁니다 .{9}*. 그런 다음 선택적 중복 캡처를 사용하여 최대 8 자 (즉, 마지막 숫자를 제외한 해당 행의 모든 ​​것)를 일치시키고 그 \3뒤를 찾습니다 .

.*(\g<2>.{8})*

일부 열에서 중복을 찾습니다. 먼저 \g<2>서브 루틴 호출이므로 다음과 같습니다.

.*((.|(.)).{8})*

방금 삽입 한 두 그룹은 여전히 2and 라고합니다 3.

여기서는 .*단순히 필요한만큼 건너 뜁니다 (여기서는 최대 8 자와 일치하기에 충분하지만 더 많은 바이트가 필요합니다). 그런 다음 외부 그룹은 한 번에 하나의 완전한 행 (두 개의 실제 행을 감쌀 수 있음)과 일치하며 선택적으로 첫 번째 문자를 캡처합니다. 은 \3캡처와 역 참조 사이의 수직 정렬을 보장이 후 오른쪽을 찾았다됩니다.

마지막으로 블록을 확인하십시오.

.{27}?.{3}?(\g<2>{3}.{6}){,2}.?.?

다시,는 \g<2>서브 루틴 호출이므로 다음과 같습니다.

.{27}?.{3}?((.|(.)){3}.{6}){,2}.?.?

블록을 확인하려면 모든 행과 열을 이미 확인 했으므로 3x3 블록 중 4 개만 확인하면됩니다. 이러한 3x3 블록뿐만 아니라 모든 행과 열이 올바른 것을 알고있는 경우 :

XX.
XX.
...

그런 다음 나머지 블록에 중복이있을 수 없음을 알고 있습니다. 따라서이 4 개의 블록 만 확인하고 있습니다. 또한 3x3 블록의 동일한 행에서 중복 항목을 찾을 필요가 없습니다. 한 행에서 사본의 첫 번째 절반을 찾아서 더 아래쪽에서 한 행에서 두 번째 절반을 검색하면 충분합니다.

이제 코드 자체의 경우 먼저 네 개의 블록 중 하나의 시작 .{27}?.{3}?으로 건너 뜁니다 (선택적으로 세 개의 행을 건너 뛰고 선택적으로 세 개의 열을 건너 뜁니다). 그런 다음 이전 행에 사용한 것과 동일한 트릭으로 3x3 블록의 두 행까지 일치 시키려고 시도합니다.

(.|(.)){3}.{6}

3x3 블록의 현재 행에있는 3 개의 셀을 캡처 할 필요는 없지만를 사용하여 다음 행으로 건너 뜁니다 .{6}. 마지막으로 행의 3 개 셀 중 하나에서 중복을 찾으려고 시도합니다.

.?.?

그리고 그게 다야.


74 : ^(?!(.*((.|(.)).{8})*|.{9}*\g<3>{,8}|.{27}?.{3}?(\g<3>{3}.{6}){,2}.?.?)\4); 73 : ^(?!(.*((.|(.)|\4()).{8})*|.{9}*\g<3>{9}|.{27}?.{3}?(\g<3>{3}.{6}){3})\5).
jimmy23013

@ jimmy23013 실제로 \4()3x3 블록의 이전 버전에서 트릭을 사용하고 있었지만 더 길기 때문에 제거했습니다. : D
Martin Ender

@ jimmy23013 73 행은 마지막 행을 확인하지 않습니다 :341572689257698143986413275862341957495726831173985426519234768734869512628517394
Martin Ender

6

자바 정규식 532 개 530 481 463 문자

행을 확인하십시오.

/^((?=.{0,8}1)(?=.{0,8}2)(?=.{0,8}3)(?=.{0,8}4)(?=.{0,8}5)(?=.{0,8}6)(?=.{0,8}7)(?=.{0,8}8)(?=.{0,8}9).{9})+$/

열 확인 :

/^((?=(.{9}){0,8}1)(?=(.{9}){0,8}2)(?=(.{9}){0,8}3)(?=(.{9}){0,8}4)(?=(.{9}){0,8}5)(?=(.{9}){0,8}6)(?=(.{9}){0,8}7)(?=(.{9}){0,8}8)(?=(.{9}){0,8}9).){9}/

첫 번째 문자에서 사각형을 확인하십시오.

/(?=.?.?(.{9}){0,2}1)(?=.?.?(.{9}){0,2}2)(?=.?.?(.{9}){0,2}3)(?=.?.?(.{9}){0,2}4)(?=.?.?(.{9}){0,2}5)(?=.?.?(.{9}){0,2}6)(?=.?.?(.{9}){0,2}7)(?=.?.?(.{9}){0,2}8)(?=.?.?(.{9}){0,2}9)/

사각형의 시작으로 미리보기를 설정하십시오.

/^(((?=)...){3}.{18})+$/

그리고 전체 표현 :

/^(?=((?=.{0,8}1)(?=.{0,8}2)(?=.{0,8}3)(?=.{0,8}4)(?=.{0,8}5)(?=.{0,8}6)(?=.{0,8}7)(?=.{0,8}8)(?=.{0,8}9).{9})+$)(?=((?=(.{9}){0,8}1)(?=(.{9}){0,8}2)(?=(.{9}){0,8}3)(?=(.{9}){0,8}4)(?=(.{9}){0,8}5)(?=(.{9}){0,8}6)(?=(.{9}){0,8}7)(?=(.{9}){0,8}8)(?=(.{9}){0,8}9).){9})(((?=.?.?(.{9}){0,2}1)(?=.?.?(.{9}){0,2}2)(?=.?.?(.{9}){0,2}3)(?=.?.?(.{9}){0,2}4)(?=.?.?(.{9}){0,2}5)(?=.?.?(.{9}){0,2}6)(?=.?.?(.{9}){0,2}7)(?=.?.?(.{9}){0,2}8)(?=.?.?(.{9}){0,2}9)...){3}.{18})+$/

전체 문자열과 일치합니다.


자바 스크립트 ES6에서 테스트 :

r = /^(?=((?=.{0,8}1)(?=.{0,8}2)(?=.{0,8}3)(?=.{0,8}4)(?=.{0,8}5)(?=.{0,8}6)(?=.{0,8}7)(?=.{0,8}8)(?=.{0,8}9).{9})+$)(?=((?=(.{9}){0,8}1)(?=(.{9}){0,8}2)(?=(.{9}){0,8}3)(?=(.{9}){0,8}4)(?=(.{9}){0,8}5)(?=(.{9}){0,8}6)(?=(.{9}){0,8}7)(?=(.{9}){0,8}8)(?=(.{9}){0,8}9).){9})(((?=.?.?(.{9}){0,2}1)(?=.?.?(.{9}){0,2}2)(?=.?.?(.{9}){0,2}3)(?=.?.?(.{9}){0,2}4)(?=.?.?(.{9}){0,2}5)(?=.?.?(.{9}){0,2}6)(?=.?.?(.{9}){0,2}7)(?=.?.?(.{9}){0,2}8)(?=.?.?(.{9}){0,2}9)...){3}.{18})+$/
;`123456789456789123789123456231564897564897231897231564312645978645978312978312645
725893461841657392396142758473516829168429537952378146234761985687935214519284673
395412678824376591671589243156928437249735186738641925983164752412857369567293814
679543182158926473432817659567381294914265738283479561345792816896154327721638945
867539142324167859159482736275398614936241587481756923592873461743615298618924375
954217683861453729372968145516832497249675318783149256437581962695324871128796534
271459386435168927986273541518734269769821435342596178194387652657942813823615794
237541896186927345495386721743269158569178432812435679378652914924813567651794283
168279435459863271273415986821354769734692518596781342615947823387526194942138657
863459712415273869279168354526387941947615238138942576781596423354821697692734185
768593142423176859951428736184765923572389614639214587816942375295837461347651298`
.split`
`.every(r.test.bind(r))
&&
`519284673725893461841657392396142758473516829168429537952378146234761985687935214
839541267182437659367158924715692843624973518573864192298316475941285736456729381
679543182158926473432817659567381294914256738283479561345792816896154327721638945
867539142324167859159482736275398684936241517481756923592873461743615298618924375
754219683861453729372968145516832497249675318983147256437581962695324871128796534
271459386435168927986273541518734269769828435342596178194387652657942813823615794
237541896186927345378652914743269158569178432812435679495386721924813567651794283
168759432459613278273165984821594763734982516596821347615437829387246195942378651
869887283619214453457338664548525781275424668379969727517385163319223917621449519
894158578962859187461322315913849812241742157275462973384219294849882291119423759
123456789456789123564897231231564897789123456897231564312645978645978312978312645
145278369256389147364197258478512693589623471697431582712845936823956714931764825`
.split`
`.every(s => !r.test(s))

열이 행보다 훨씬 쉬워야한다고 생각하므로 열 정규 표현식이 행 열보다 길다는 것이 궁금합니다.
피터 테일러

그래서, @PeterTaylor, 그들은 동일한 구조를 가지고 있지만, 열에 나는 9 개 문자 대신 1을 건너가 .들어간 (.{9})때문에 다음의 브래킷 {0,8}. 왜 열이 더 짧아야한다고 생각합니까?
Qwertiy

@PeterTaylor, 네, 부정을 확인하면 열이 더 간단했을 것입니다.
Qwertiy

@ SuperJedi224, 왜 자바 스크립트입니까? 이 정규식이 모든 곳에서 유효 할 것으로 기대합니다.
Qwertiy

6
@Qwertiy 정규 표현식은 여러 가지 맛으로 작동하지만 lookaheads (예 : Lua 또는 OCaml에서는 사용할 수 없음)에 의존합니다. 또한 완전히 다른 구문을 사용하는 유효하지 않은 기본 또는 확장 정규식입니다. 솔루션이 다른 많은 솔루션에서 작동하더라도 타당성 주장에 대한 향을 선택하는 것이 가장 좋습니다.
Dennis
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.