我正在从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]
-g
或G
(?:[oO0]|\(\)|\[]|<>){2}
-两次出现[o0]
-o
,O
或0
|
-或\(\)
-一个()
子字符串|
-或\[]
-一个[]
子字符串|
-或<>
-一个<>
子字符串[gG]
-g
或G
[LlI]
-l
,L
或I
[eE3]
-e
,E
或3
。