0

私は"KQkq" <or> "-"、最初のケースでは、いずれかの文字が欠落している可能性があることを検証しようとしています(すべての文字が欠落している可能性があります。その場合は、欠落しているはずです"-")。文字の順序も重要です。

したがって、法的な例の簡単な例は次のとおりです。

  • -
  • Kkq
  • q

これはチェスFEN検証用です。最初の2つの部分は、以下を使用して検証しました。

var fen_parts = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
fen_parts = fen_parts.split(" ");

if(!fen_parts[0].replace(/[1-8/pnbrqk]/gi,"").length
&& !fen_parts[1].replace(/[wb]/,"").length
&& !fen_parts[2].replace(/[kq-]/gi,"").length /*not working, allows KKKKKQkq to be valid*/
){
    //...
}

しかし、単に/[kq-]/gi3番目の部分を検証するために使用すると、導入されるものが多すぎます。ここに、違法な例の簡単な例をいくつか示します。

  • KKKKQkq(複数のKがあります)
  • QK(順序が正しくありません)
4

3 に答える 3

1

できるよ

-|K?Q?k?q?

ただし、入力が空でないことを確認するために2番目のテストを実行する必要があります。または、正規表現のみを使用します。

KQ?k?q?|Qk?q?|kq?|q|-
于 2013-03-07T22:32:58.920 に答える
1

これは私にとってはうまくいくようです...

^(-|(K)?((?!\2)Q)?((?!\2\3)k)?((?!\2\3\4)q)?)$

于 2013-03-07T22:50:58.020 に答える
0

式が一致しなかった場合はA.match()が返されます。nullその場合、logical ORデフォルトで空の文字列(.match()成功した一致で返されるものと同様の構造)を持つ配列に設定できます。これにより、一致した式の長さを確認できます。0式が一致しなかった場合、またはK?Q?k?q?空の文字列と一致した場合の長さになります。パターンが一致する場合、長さはになります> 0。コードで:

("KQkq".match(/^(?:K?Q?k?q?|-)$/) || [""])[0].length

は予想よりも「強い」ため|、実際の表現をキャプチャしないグループでラップする必要があります(?:)


質問に答えたら、残りのコードを見てみましょう。

if (!fen_parts[0].replace(/[1-8/pnbrqk]/gi,"").length)

は、javascriptの観点からは次のようになります

if (!fen_parts[0].match(/[^1-8/pnbrqk]/gi))

これは、「文字以外の場合はfalse」に変換されます1-8/pnbrqk。この表記は、読みやすくなるだけでなく、不要な文字列の変更(置換)や計算(長さ)が行われないため、実行速度も速くなります。

于 2013-03-07T23:13:36.150 に答える