在另一个问题中,我学习了如何使用正则表达式计算顺手牌(这里)。
现在,出于好奇,问题是:我可以使用正则表达式来计算相同的东西,使用 ASCII 代码吗?
就像是:
正则表达式:[C][C+1][C+2][C+3][C+4],是 C 的 ASCII 代码(或像这样)
匹配:45678
,23456
不匹配:45679
或23459
(不按顺序)
您的主要问题实际上是您的手没有使用 ASCII 连续编码,您将数字用于非面部卡片,而将非连续、无序字符用于面部卡片。
您需要在字符串的开头检测2345A, 23456, 34567, ..., 6789T, 789TJ, 89TJQ, 9TJQK
和TJQKA
。
这些不是连续的 ASCII 代码,即使它们是连续的,您也会遇到问题,因为两者A2345
都是TJQKA
有效的,并且您不会A
同时小于和大于同一字符集中的其他字符。
如果必须由正则表达式完成,则以下正则表达式段:
(2345A|23456|34567|45678|56789|6789T|789TJ|89TJQ|9TJQK|TJQKA)
可能是你会得到的最简单和最易读的一个。
像
regex: [C][C+1][C+2][C+3][C+4]
,是C
ASCII 代码(或像这样)
在大多数正则表达式风格中,您无法做任何与此非常接近的事情。这根本不是正则表达式设计的那种模式。
没有主流的正则表达式模式可以简洁地匹配任何两个x
在 ASCII 编码上不同的连续字符。
给你(见ideone.com):
String alpha = "ABCDEFGHIJKLMN";
String p = alpha.replaceAll(".(?=(.))", "$0(?=$1|\\$)|") + "$";
System.out.println(p);
// A(?=B|$)|B(?=C|$)|C(?=D|$)|D(?=E|$)|E(?=F|$)|F(?=G|$)|G(?=H|$)|
// H(?=I|$)|I(?=J|$)|J(?=K|$)|K(?=L|$)|L(?=M|$)|M(?=N|$)|N$
String p5 = String.format("(?:%s){5}", p);
String[] tests = {
"ABCDE", // true
"JKLMN", // true
"AAAAA", // false
"ABCDEFGH", // false
"ABCD", // false
"ACEGI", // false
"FGHIJ", // true
};
for (String test : tests) {
System.out.printf("[%s] : %s%n",
test,
test.matches(p5)
);
}
这使用元正则表达式技术来生成模式。该模式使用lookahead确保每个字符后跟正确的字符(或字符串的结尾)。然后对该模式进行元正则表达式以重复匹配 5 次。
您可以alpha
根据需要用您的扑克顺序替换。
请注意,这是一个绝对不切实际的解决方案。例如只检查 if 更具可读性alpha.contains(test) && (test.length() == 5)
。
解决了!
我在js中使用闭包解决了。
String.prototype.isSequence = function () {
If (this == "A2345") return true; // an exception
return this.replace(/(\w)(\w)(\w)(\w)(\w)/, function (a, g1, g2, g3, g4, g5) {
return code(g1) == code(g2) -1 &&
code(g2) == code(g3) -1 &&
code(g3) == code(g4) -1 &&
code(g4) == code(g5) -1;
})
};
function code(card){
switch(card){
case "T": return 58;
case "J": return 59;
case "Q": return 60;
case "K": return 61;
case "A": return 62;
default: return card.charCodeAt();
}
}
test("23456");
test("23444");
test("789TJ");
test("TJQKA");
test("8JQKA");
function test(cards) {
alert("cards " + cards + ": " + cards.isSequence())
}
只是为了澄清,ascii代码:
ASCII码:
2 = 50
3 = 51
4 = 52
5 = 53
6 = 54
7 = 55
8 = 56
9 = 57
T = 84 -> 58
J = 74 -> 59
Q = 81 -> 60
K = 75 -> 61
A = 65 -> 62