我正在尝试对"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
(订单不正确)答案 0 :(得分:1)
你可以做到
-|K?Q?k?q?
虽然您需要进行第二次测试以确保输入不为空。或者,仅使用正则表达式:
KQ?k?q?|Qk?q?|kq?|q|-
答案 1 :(得分:1)
这似乎对我有用......
^(-|(K)?((?!\2)Q)?((?!\2\3)k)?((?!\2\3\4)q)?)$
答案 2 :(得分:0)
如果表达式不匹配,则.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
”。这种表示法不仅更易于阅读,而且执行速度更快,因为没有不必要的字符串变换(替换)和计算(长度)。