我正在从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");
}}
答案 0 :(得分:4)
当前正则表达式的问题在于,[]
,()
和<>
被放在与单个字符匹配的字符类中,但是()
,{ {1}}和<>
字符序列由2个字符组成。
您需要在此处使用带有备用运算符的分组构造来匹配[]
。
您可以将此模式与o
一起使用:
Pattern.matches()
请参见regex demo
详细信息
Pattern pattern = Pattern.compile("[gG](?:[oO0]|\(\)|\[]|<>){2}[gG][LlI][eE3]");
-[gG]
或g
G
-两次出现
(?:[oO0]|\(\)|\[]|<>){2}
-[o0]
,o
或O
0
-或|
-一个\(\)
子字符串()
-或|
-一个\[]
子字符串[]
-或|
-一个<>
子字符串<>
-[gG]
或g
G
-[LlI]
,l
或L
I
-[eE3]
,e
或E
。答案 1 :(得分:1)
您可以使用此
使用case insensitive
标志时,不需要同时添加字母的大写和小写字母。
g(?:o|0|<>|\[]){2}g[li][e3]
g
-与g
或G
匹配(因为不区分大小写的标志处于启用状态)(?:o|0|<>|\[])
-匹配o
或0
或<>
或[]
。[li]
-匹配L
或l
或I
或i
。[e3]
-匹配e
或E
或3
答案 2 :(得分:0)
我向您建议此版本的regex字符串以及代码:
String string = bufferedReader.readLine();
String regex = "^[gG]([o0O]|\\(\\)|\\[\\]|\\{\\}|\\<\\>){2}[gG][lLI][eE3]";
String result = Pattern.matches(regex, string) ? "True" : "False";
System.out.println(result);
由于这是一次“一次性”搜索,因此可以使用Pattern类的静态方法“ matches”。也就是说,直接从与您的正则表达式的一次匹配中得出结果。
正则表达式与您设计的正则表达式基本相同,但有几点值得注意。
当您的正则表达式尝试提取不同大小写的字母时,使用不区分大小写是危险的(如果不是错误的话)。如果要以经典方式进行匹配,请避免使用不区分大小写的标志。 (在这种情况下,它将匹配用小写的“ i”代替“ L”的“ google”,这将导致误报。)
由于只有一种表达“ o”的方式,因此最好将其定义分组在一个子表达式中,然后使用量词“ {2}”表示您确实想要该子表达式的两个实例匹配。
您要查找两次EITHER
最后但并非最不重要的一点是,如果您要查找简单的,方括号,花括号或角括号,则必须 转义它们,因为这些是正则表达式中的特殊字符。此外,您必须使用双斜杠以Java方式对它们进行转义。
这是完整的代码:
public static void main(String[] args) throws IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
String string = bufferedReader.readLine();
String regex = "^[gG]([o0O]|\\(\\)|\\[\\]|\\{\\}|\\<\\>){2}[gG][lLI][eE3]";
String result = Pattern.matches(regex, string) ? "True" : "False";
System.out.println(result);
bufferedReader.close();
}
在输入“ g()()GI3”后显示“ True”