我正在从Hackerrank解决这个问题

https://www.hackerrank.com/contests/find-google/challenges/find-google/problem

并提出了这种模式
“ ^ [gG] [o0O()\ [\] {}] [o0O()\ [\] {}] [gG] [lLI] [eE3]”
但这为测试用例g()()GI3提供了错误的答案。谁能告诉我这个错误?还告诉我是否有更有效的表达方式。

    import java.util.regex.*;
    import java.io.*;
    import java.util.*;
    class Main {

public static void main (String[] args) {
    Scanner s = new Scanner(System.in);
    String str = s.next();
    Pattern pattern = Pattern.compile("^[gG][o0O()\\[\\]{}][o0O()\\[\\]{}][gG][lLI][eE3]",Pattern.CASE_INSENSITIVE);
    Matcher matcher = pattern.matcher(str);
    if(matcher.matches())
    System.out.println("YES");
    else System.out.println("NO");
}}

最佳答案

当前正则表达式的问题在于,将[]()<>放在与单个字符匹配的字符类中,但是()<>[]字符序列由2个组成字符

您需要在此处使用带有备用运算符的分组构造来匹配o

您可以在Pattern.matches()中使用此模式:

Pattern pattern = Pattern.compile("[gG](?:[oO0]|\(\)|\[]|<>){2}[gG][LlI][eE3]");


请参见regex demo

细节


[gG]-gG
(?:[oO0]|\(\)|\[]|<>){2}-两次出现


[o0]-oO0
|-或
\(\)-一个()子字符串
|-或
\[]-一个[]子字符串
|-或
<>-一个<>子字符串

[gG]-gG
[LlI]-lLI
[eE3]-eE3

09-25 19:23