如何查找可能缺少某些字符的模式,但是遵循某个顺序?

时间:2013-03-07 22:26:15

标签: javascript regex

我正在尝试对"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(订单不正确)

3 个答案:

答案 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”。这种表示法不仅更易于阅读,而且执行速度更快,因为没有不必要的字符串变换(替换)和计算(长度)。