Регулярное выражение - образец строки соответствия

1

Я хочу распечатать позицию второго появления zip в text или -1, если он не встречается не реже двух раз.

public class UdaciousSecondOccurence {

    String text = "all zip files are zipped";
    String text1 = "all zip files are compressed";

    String REGEX = "zip{2}"; // atleast two occurences

    protected void matchPattern1(){
        Pattern p = Pattern.compile(REGEX);

        Matcher m = p.matcher(text);

        while(m.find()){

            System.out.println("start index p" +m.start());
            System.out.println("end index p" +m.end());
        //  System.out.println("Found a " + m.group() + ".");

        }

вывод для matchPattern1() start index p18 end index p22

Но он ничего не печатает для шаблона text1 - я использовал аналогичный метод для второго шаблона -

  • 2
    Это только у меня так или text1 не содержит последовательности "zipp"?
  • 0
    Ваше регулярное выражение неверно, zip{2} будет соответствовать zipp
Показать ещё 1 комментарий
Теги:

8 ответов

0
Лучший ответ

Если он должен совпадать дважды, а не использовать цикл while, я бы закодировал его так, используя regex "zip" (один раз, а не дважды):

if (m.find() && m.find()) {
    // found twice, Matcher at 2nd match
} else {
    // not found twice
}

ps text1 не имеет двух молний

  • 0
    Хорошо, да, я вижу, как это может изменить логику - спасибо
  • 0
    Конечно, вы должны искать только "почтовый индекс" (один почтовый индекс, а не два)
Показать ещё 1 комментарий
1

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

public class UdaciousSecondOccurence {

String text = "all zip files are zipped";
String text1 = "all zip files are compressed";

String REGEX = "zip{2}"; // atleast two occurences

protected void matchPattern1(){
    Pattern p = Pattern.compile(REGEX);

    Matcher m = p.matcher(text);

    if(m.find()){   
        System.out.println("start index p" +m.start());
        System.out.println("end index p" +m.end());
        //  System.out.println("Found a " + m.group() + ".");

    }else{
        System.out.println("-1");
    }
}

public static void main(String[] args)  {

         UdaciousSecondOccurence uso  = new UdaciousSecondOccurence();
         uso.matchPattern1();
    }   

 }
  • 0
    выход - start index1 18 end index1 22 -1 Я думаю, что это решает большую часть проблемы.
  • 0
    Разве ваш конечный индекс не должен быть 21, а не 22?
1

text1 не соответствует regex zip{2}, поэтому цикл while никогда не выполняется, потому что совпадений нет.

Выражение пытается zipp литерал zipp, который содержится в text но не в text1. RegExr

Если вы хотите совместить второе вхождение, я бы рекомендовал использовать группу захвата:. .*zip.*?(zip)

пример

    String text = "all zip files are zip";
    String text1 = "all zip files are compressed";

    String REGEX = ".*zip.*?(zip)";
    Pattern p = Pattern.compile(REGEX);
    Matcher m = p.matcher(text);

    if(m.find()){       
            System.out.println("start index p" + m.start(1));
            System.out.println("end index p" + m.end(1));
    }else{
        System.out.println("Match not found");
    }
0

zip{2} соответствует строке zipp - {2} применяется только к элементу, непосредственно предшествующему. 'п'.

Это не то, что вы хотите.

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

  • 0
    Спасибо за разъяснение -
0

Почему бы вам просто String.indexOf дважды использовать String.indexOf?

String text = "all zip files are zipped";
String text1 = "all zip files are compressed";
int firstOccurrence = text.indexOf("zip");
int secondOccurrence = text.indexOf("zip", firstOccurrence + 1);
System.out.println(secondOccurrence);
firstOccurrence = text1.indexOf("zip");
secondOccurrence = text1.indexOf("zip", firstOccurrence + 1);
System.out.println(secondOccurrence);

Вывод

18
-1
  • 0
    очень хорошо, я всегда забывал метод indexOf - когда вы впервые читаете java REGEX - он просто создает больше путаницы, чем решение проблем
  • 0
    @ kasper_341 да, иногда есть более простые решения, чем регулярные выражения :)
0

Во второй раз утверждения внутри while(m.find()) никогда не выполняются. потому что find() не сможет найти соответствия

0

Вам нужно одно или два соответствия шаблону. Попробуйте с regex zip{1,2},

  String REGEX = "zip{1,2}";
0

Могут быть две причины: 1st: Text1 не содержит двух "zip". 2-й: вам нужно добавить фрагмент кода, который печатает "-1" при отсутствии совпадения. например, если m.find = true, тогда распечатать индекс else print -1

Ещё вопросы

Сообщество Overcoder
Наверх
Меню