Regex Golf:数独ソリューションの検証


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

規則はおそらく今では一般的な知識ですが、念のため...数独ボードは次の場合にのみ有効です:

  • 各行にはから1までの数字が91回だけ含まれています。
  • 各列にはから1までの数字が91回だけ含まれています。
  • 9個の3x3サブグリッドのそれぞれには、から1までの数字が91回だけ含まれています。

ルール

答えは、追加のコードを含まない単一の正規表現で構成する必要があります(オプションで、ソリューションを機能させるために必要な正規表現修飾子のリストを除く)。ホスティング言語でコードを呼び出すことができる言語の正規表現フレーバーの機能(Perlのe修飾子など)を使用しないでください。

このチャレンジの前に存在していた正規表現フレーバーを使用できますが、フレーバーを指定してください。

正規表現が暗黙的にアンカーされていると想定しないでください。たとえば、Pythonを使用している場合、正規表現はで使用しre.search、ではなく使用すると仮定しますre.match。正規表現は、文字列全体と一致する必要はありません。有効なソリューションの場合は少なくとも1つのサブストリング(空の場合もある)と一致する必要があり、無効なソリューションの場合は一致しません。

入力は常に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

さらにテストケースを行うには、このCJamスクリプト使用して、有効なボードを入力としてランダムにシャッフルして、新しい有効なボードを提供します(数字とオプションの空白のみが含まれている限り、入力形式は無関係です)。

正規表現が.NETフレーバーと互換性がある場合、Retinaを使用してオンラインでテストできます。有効なソリューションは0、無効なボードに対しては印刷し、有効なボードに対しては正の整数を印刷する必要があります。すべてのテストケースを一度に実行するには、このテンプレート使用して、2行目に正規表現を挿入します。正規表現修飾子が必要な場合は`、正規表現の先頭にa を付けて、標準修飾子文字をその前に置きます。



1
これだけが[code-bowling]だったら、笑。
mbomb007

待ってください... Pythonを使用している場合、正規表現のみを使用でき、それ以外は何も使用できません また、各ボードの大きさは?特定のサイズはありますか?そうでない場合、下の数字の塊から各ボードをどのように抽出する必要がありますvalid boardsか?
R. Kap

@ R.Kap使用しているフレーバーに関係なく、正規表現(および場合によっては一部の修飾子)のみを送信する必要があります。各入力はちょうど81桁で、フルボードを表します。(テストケースの各行は個別のボードです。)
マーティンエンダー

SQLで簡単な数独を解くスクリプトを書きました。この質問のために書き直せると確信しています。ただし、SQLには多くのREGEXがありません。それは答えを失格にしますか?(スクリプトはおそらく400文字より少し低いでしょう)
-t-clausen.dk

回答:


40

Rubyの正規表現、71 78 73バイト

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

私はRubyを本当に知らないが、どうやらカスケードされた量指定子について文句を言わないようだ。

ここで試してみてください。

.NET正規表現、79 78 75または77バイト

マーティンはこれが可能であると考えているため...しかし、私は彼もこれらの変更を組み込むだけだと思います。

^(?!(.)+((.{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に切り替える必要がありました。それを破ってしまうことは間違いありません。:)
マーティンエンダー

@MartinBüttnerうん。
ニックハートリー

先読みを使用して@MartinBüttnerを(当時は)4バイト倒すのはいいことだと思いましたが、それを次のレベルに引き上げました。
ニール

申し訳ありませんが、これは(1、2)と(2、1)のセルが同じであるかどうかを検出しません。同様に、複製が下と左にある正方形の他のすべてのセルについても同様です。
ニール

1
@MartinBüttner2番目のPCREバージョンをRubyに翻訳できることに気付きました...今すぐ答えを投稿できると思います
...-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)

Python、Javaなどのフレーバーでも動作するはずです。再帰を使って!そして、「再帰」機能は「サブルーチン」に非再帰的に使用されていましたが、実際の再帰を使用するまで完全に忘れていました。


クールなアイデア-norepeatを一致させるのではなく、繰り返しを避ける!
-Qwertiy

1
あなたが書くことができないのは残念です.{27}*
ニール

フン、私はあなたがそれを書き換えたいことを見つけるために、121バイトまでのご133バイトソリューションをgolfedだろうが、ここでは、とにかくです:^(?!(.{27})*(.{9})?(...){0,2}.?.?(.).?.?(?=(...)*$)(.{9})?.{6,8}\4.{0,17}(.{27})*$|.*(.)((.{9})+|((?!(.{9})*$).)+)(<=\8))
ニール

@Neilそれはどんな味ですか?PCREまたは私が知っている他の人は、後読みで後方参照を許可しません。
feersum

@Neil (<=\8)は有効な構文のようには見えません(a がありません?)。また、後読みで後方参照をサポートする唯一のフレーバーは.NETです。
マーティンエンダー

15

.NET正規表現、8339バイト

はい、私のソリューションは非常に素朴であることがわかっています。Martinが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
何が面白いか知っていますか?try itオンラインリンクは長すぎるためIEをクラッシュさせます:P
cat

15
@cat IEの唯一の本当の目的は、ユーザーがFirefox(またはChromium)をダウンロードできるようにすることです。
バイトコマンダー

2
@cat 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バイト節約できます。:)
マーティンエンダー

8

PCRE、3579バイト

絶対に恐ろしいブルートフォースソリューション。負の後読み

私はこれを放棄するのにあまりにも多くの時間を費やしたので、後世のためにここにあります。

明るい面で、Sudokuが突然9文字の別のセットを使用し始めた場合、これはまだ機能すると思います...

http://pastebin.com/raw/CwtviGkC

Retinaの操作方法はわかりませんが、https://regex101.comなどに貼り付けると一致します。

正規表現の生成に使用されるRubyコード:

# 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の答えの場合のように)正規表現の他の部分と組み合わせることができない場合にはおそらく無敵でしょう。

説明

他の短い答えのように、行、列、またはブロックの重複を検索する否定的な先読みを使用しています。ソリューションの基本的な構成要素は次のとおりです。

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

\3は、3つの異なる選択肢間で再利用されることに注意してください(これらはすべて3重複検出にグループを使用します)。

左側のグループ(group 2を含むgroup 3)は、重複する数字の前半を含むことができる任意の位置(重複する数字を含むことのできないグループ内)に使用されます。次に...、そのような数字が発生する可能性がある次の位置を取得し(必要な場合)、\3後方参照を介して重複の後半を見つけようとします。これが機能する理由は後戻りです。エンジンが最初に一致したとき、毎回(.|(.))単に使用し.、何もキャプチャしません。これ\3で最後に失敗します。しかし今では、エンジンは個々の試合(.).はなく徐々に使用してみます。最終的に、重複がある場合は、組み合わせを見つけます(.)(キャプチャが後で上書きされないように)複製の最初の桁で最後に使用され、その後.、後方参照にギャップを埋めるためにさらに使用されます。重複がある場合、バックトラッキングは常にそれを見つけます。

これが使用される3つの異なる部分を見てみましょう。

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

これにより、いくつかの行の重複がチェックされます。まず、で任意の行にスキップします.{9}*。次に、オプションの重複キャプチャを使用して最大8文字(つまり、その行の最後の数字を除くすべて)を照合し、その後を見つけようとします\3

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

これは、いくつかの列で重複を探します。まず、\g<2>これはサブルーチン呼び出しであるため、これは次と同じです。

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

私達はちょうど挿入した二つのグループはまだと呼ばれているところ23

ここでは、.*必要な限り単純にスキップします(ここで最大8文字を一致させるのに十分ですが、それはより多くのバイトを必要とします)。次に、外側のグループは一度に1つの完全な行(2つの物理行にまたがる場合があります)に一致し、オプションで最初の文字をキャプチャします。この\3直後にが検索されます。これにより、キャプチャと後方参照の垂直方向の配置が保証されます。

最後に、ブロックを確認します。

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

繰り返し\g<2>ますが、これはサブルーチン呼び出しであるため、これは次と同じです。

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

ブロックを検証するには、すべての行と列を既にチェックしているため、3x3ブロックのうち4つだけをチェックする必要があることに注意してください。すべての行と列、およびこれらの3x3ブロックが正しいことがわかっている場合:

XX.
XX.
...

その後、残りのブロックに重複が存在する可能性はないことがわかります。したがって、これらの4つのブロックのみをチェックしています。さらに、3x3ブロックの同じ行内で重複を探す必要がないことに注意してください。1行で重複の前半を見つけ、さらに下の行で後半を検索するだけで十分です。

コード自体については、最初に4つのブロックのいずれかの先頭までスキップします.{27}?.{3}?(オプションで3行をスキップし、オプションで3列をスキップします)。次に、3x3ブロックの行のうち最大2行を、前の行で使用したのと同じトリックで一致させようとします。

(.|(.)){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
マーティンエンダー

@ jimmy23013 73は最後の行をチェックしません:341572689257698143986413275862341957495726831173985426519234768734869512628517394
Martin Ender

6

Javascriptの正規表現、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})+$/

文字列全体に一致します。


Javascript 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、それらは同じ構造を持っていますが、列の場合、1の代わりに9文字をスキップする必要.がある(.{9})ため、nextのために角かっこに入ります{0,8}。なぜ列を短くすべきだと思いますか?
Qwertiy

@PeterTaylor、うん、否定をチェックすることを推測した場合、列は単純になります。
Qwertiy

@ SuperJedi224、なぜjavascriptなのですか?この正規表現はどこでも有効であると期待しています。
Qwertiy

6
@Qwertiy正規表現は多くのフレーバーで動作するはずですが、先読みに依存しています(たとえば、LuaやOCamlでは使用できません)。また、完全に異なる構文を使用する無効な基本または拡張正規表現でもあります。ソリューションが他の多くで機能する場合でも、有効性の主張にはフレーバーを選択することが最善です。
デニス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.