4

在另一个问题中,我学习了如何使用正则表达式计算顺手牌(这里)。

现在,出于好奇,问题是:我可以使用正则表达式来计算相同的东西,使用 ASCII 代码吗?

就像是:

正则表达式:[C][C+1][C+2][C+3][C+4],是 C 的 ASCII 代码(或像这样)

匹配:45678,23456

不匹配:4567923459(不按顺序)

4

4 回答 4

5

您的主要问题实际上是您的手没有使用 ASCII 连续编码,您将数字用于非面部卡片,而将非连续、无序字符用于面部卡片。

您需要在字符串的开头检测2345A, 23456, 34567, ..., 6789T, 789TJ, 89TJQ, 9TJQKTJQKA

这些不是连续的 ASCII 代码,即使它们是连续的,您也会遇到问题,因为两者A2345都是TJQKA有效的,并且您不会A同时小于和大于同一字符集中的其他字符。

如果必须由正则表达式完成,则以下正则表达式段:

(2345A|23456|34567|45678|56789|6789T|789TJ|89TJQ|9TJQK|TJQKA)

可能是你会得到的最简单和最易读的一个。

于 2010-08-14T11:37:22.140 回答
4
于 2010-08-17T10:11:06.427 回答
3

regex: [C][C+1][C+2][C+3][C+4],是CASCII 代码(或像这样)

在大多数正则表达式风格中,您无法做任何与此非常接近的事情。这根本不是正则表达式设计的那种模式。

没有主流的正则表达式模式可以简洁地匹配任何两个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)

相关问题

于 2010-08-14T10:13:16.450 回答
0

解决了!

http://jsfiddle.net/g48K9/3

我在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
于 2011-10-13T14:54:19.200 回答