我想创建一个正则表达式,其中一个组的出现取决于是否找到了另一个特定的组。我认为通过一个例子更容易说明!
我想允许两种模式,如以下两个示例所示:JsJh
,JJ
。
不允许这样做:JsJs
,JsJ
,JQ
。
因此,如果用户在第一个大写字母后输入一个小写字母,正则表达式会在第二个大写字母后面写另一个小写字母 - 但它不应该与第一个大写字母相同!
我匹配第一个(Js):([123456789TJQKA]){1}([dsch]?){1}
第二个大写字母由(\\2)
匹配。
现在,我似乎无法找到最后一封小写字母的解决方案。我可以得到匹配的小字母(这不是我想要的),但是如果它存在,我如何排除最后一组中的第一个字母,仍然允许(并期待)剩下的三个中的一个小信吗?
答案 0 :(得分:1)
为什么使用正则表达式来实现纸牌游戏的逻辑?看起来很疯狂......然而它可以做到!
s.matches("([123456789TJQKA])([dchs])\\1(?!\\2)[dchs]|([123456789TJQKA])\\3")
这是一个测试,以验证它是否正常工作(并且它还记录了我对您未在问题中涉及的特殊情况的假设):
public class Test
{
private static void test(String input, boolean expected)
{
boolean result = input.matches("([123456789TJQKA])([dchs])\\1(?!\\2)[dchs]|([123456789TJQKA])\\3");
if (result != expected)
throw new RuntimeException("Failed!");
}
public static void main(String[] args) throws Exception
{
test("JJ", true);
test("JsJd", true);
test("11", true);
test("2c2h", true);
test("Js", false);
test("JsJs", false);
test("JsJ", false);
test("JQ", false);
test("1d1d", false);
test("J", false);
test("", false);
test("3d3d", false);
test("JsJdJ", false);
test("JsJdJh", false);
test("1A", false);
}
}