Каков правильный шаблон регулярных выражений для этого? - PullRequest
0 голосов
/ 31 декабря 2018

Я решал этот вопрос от Хакерранка

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 голосов
/ 31 декабря 2018

Вы можете использовать это

Вам не нужно добавлять прописные и строчные буквы, когда вы используете 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

Демо

0 голосов
/ 31 декабря 2018

Я предлагаю вам эту версию строки регулярного выражения вместе с кодом:

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.То есть, запишите результат непосредственно из одноразового матча с вашим регулярным выражением.

Регулярное выражение в основном совпадает с тем, которое вы разработали, но некоторые моменты стоит отметить.

Этоопасно (если не ошибочно) использовать нечувствительность к регистру, когда ваше регулярное выражение пытается подобрать буквы другого регистра.Если вы хотите выполнить сопоставление классическим способом, избегайте использования флага нечувствительности к регистру.(в данном конкретном случае он будет соответствовать «google», написанному строчными буквами «i» вместо «L», что приведет к ложным срабатываниям).

Поскольку существует только один способ выразить«o», лучше сгруппировать его определение в одно подвыражение, а затем использовать квантификатор «{2}», чтобы сказать, что вы точно хотите, чтобы два экземпляра этого подвыражения совпадали.

Вы хотитечтобы найти два вхождения EITHER

  • в нижнем / верхнем регистре "o"
  • ноль
  • a пара норма / квадрат/ фигурные / угловые скобки

И последнее, но не менее важное: если вы ищете простые, квадратные, фигурные или угловые скобки, вы должны избегать их, потому что это специальные символы врегулярное выражение.Кроме того, вы должны избежать их путем 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();
}

Он печатает «True» при подаче с помощью ввода «g ()() GI3"

0 голосов
/ 31 декабря 2018

Проблема с текущим регулярным выражением состоит в том, что [], () и <> помещаются в класс символов, который соответствует одному символу внутри него, но (), <> и [] char последовательности состоят из 2 символов.

Вам необходимо использовать конструкцию группировки с оператором чередования для соответствия o s.

Вы можете использовать этот шаблон с Pattern.matches():

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

См. regex demo

Подробнее

  • [gG] - g или G
  • (?:[oO0]|\(\)|\[]|<>){2} - два вхождения
    • [o0] - o, O или 0
    • | - или
    • \(\) - a () подстрока
    • | - или
    • \[] - [] подстрока
    • | - или
    • <> -<> подстрока
  • [gG] - g или G
  • [LlI] - l, L или I
  • [eE3] - e, E или 3.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...