0

我正在尝试验证"KQkq" <or> "-",在第一种情况下,任何字母都可能丢失(期望所有字母,在这种情况下应该是"-")。字符的顺序也很重要。

法律示例的快速示例如下:

  • -
  • Kkq
  • q

这是为了进行国际象棋FEN验证,我已经使用以下方法验证了前两部分:。

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-]/gi验证第三部分允许引入太多东西,这里有一些非法示例的快速示例:

  • KKKKQkq(有不止一个K)
  • QK(顺序不正确)
4

3 回答 3

1

这似乎对我有用......

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

于 2013-03-07T22:50:58.020 回答
1

你可以做

-|K?Q?k?q?

尽管您需要进行第二次测试以确保输入不为空。或者,仅使用正则表达式:

KQ?k?q?|Qk?q?|kq?|q|-
于 2013-03-07T22:32:58.920 回答
0

如果表达式不匹配,则.match()返回A。null在这种情况下,您可以使用logical ORto 默认为具有空字符串的数组(一种类似于.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))

翻译为“如果有任何字符,则为假,但1-8/pnbrqk”。这种表示法不仅更易于阅读,而且执行速度更快,因为没有不必要的字符串突变(替换)和计算(长度)。

于 2013-03-07T23:13:36.150 回答