正确的正则表达式模式是什么?

时间:2018-12-31 12:29:14

标签: java regex

我正在从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");
}}

3 个答案:

答案 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]oO
    • 0-或
    • |-一个\(\)子字符串
    • ()-或
    • |-一个\[]子字符串
    • []-或
    • |-一个<>子字符串
  • <>-[gG]g
  • G-[LlI]lL
  • I-[eE3]eE

答案 1 :(得分:1)

您可以使用此

使用case insensitive标志时,不需要同时添加字母的大写和小写字母。

g(?:o|0|<>|\[]){2}g[li][e3]
  • g-与gG匹配(因为不区分大小写的标志处于启用状态)
  • (?:o|0|<>|\[])-匹配o0<>[]
  • [li]-匹配LlIi
  • [e3]-匹配eE3

Demo

答案 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

  • 大小写为“ o”的
  • 一对正/方形/卷曲/角形括号

最后但并非最不重要的一点是,如果您要查找简单的,方括号,花括号或角括号,则必须 转义它们,因为这些是正则表达式中的特殊字符。此外,您必须使用双斜杠以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”