Я хочу распечатать позицию второго появления 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
- я использовал аналогичный метод для второго шаблона -
Если он должен совпадать дважды, а не использовать цикл while, я бы закодировал его так, используя regex "zip"
(один раз, а не дважды):
if (m.find() && m.find()) {
// found twice, Matcher at 2nd match
} else {
// not found twice
}
ps text1 не имеет двух молний
Используйте приведенный ниже код, который может сработать для вас
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();
}
}
start index1 18 end index1 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");
}
zip{2}
соответствует строке zipp
- {2}
применяется только к элементу, непосредственно предшествующему. 'п'.
Это не то, что вы хотите.
Возможно, вы просто хотите использовать zip
качестве своего регулярного выражения и оставить счетчик событий в коде вокруг него.
Почему бы вам просто 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
indexOf
- когда вы впервые читаете java REGEX - он просто создает больше путаницы, чем решение проблем
Во второй раз утверждения внутри while(m.find())
никогда не выполняются. потому что find()
не сможет найти соответствия
Вам нужно одно или два соответствия шаблону. Попробуйте с regex zip{1,2}
,
String REGEX = "zip{1,2}";
Могут быть две причины: 1st: Text1 не содержит двух "zip". 2-й: вам нужно добавить фрагмент кода, который печатает "-1" при отсутствии совпадения. например, если m.find = true, тогда распечатать индекс else print -1
text1
не содержит последовательности "zipp"?zip{2}
будет соответствоватьzipp