正则表达式 - 匹配字符串模式

时间:2014-06-03 10:14:26

标签: java regex

我想在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()的输出     开始索引p18     结束指数p22

但是它没有为模式text1打印任何东西 - 我使用了类似的方法用于第二种模式 -

8 个答案:

答案 0 :(得分:1)

text1与正则表达式zip{2}不匹配,因此while循环从不迭代,因为没有匹配项。

该表达式尝试匹配文字zipp,其中包含text但不包含text1regexr

如果您想匹配第二次出现,我建议您使用捕获组:.*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");
    }

答案 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();
    }   

 }

答案 2 :(得分:0)

zip{2}匹配字符串zipp - {2}仅适用于紧接在前的元素。 ' P'

这不是你想要的。

您可能只想使用zip作为正则表达式,并将出现次数计算在其周围的代码中。

答案 3 :(得分:0)

为什么不两次使用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

答案 4 :(得分:0)

第二次,while(m.find())内的语句永远不会被执行。因为find()无法找到任何匹配

答案 5 :(得分:0)

您需要一个或两个模式匹配。尝试使用正则表达式zip{1,2}

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

答案 6 :(得分:0)

如果它必须匹配两次,而不是使用while循环,我会使用正则表达式"zip"(一次,而不是两次)来编码它:

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

P.S。 text1没有两个拉链

答案 7 :(得分:0)

可能有两个原因: 第1名:Text1不包含两个&#39; zip&#39;。 第二:你需要添加一段代码来打印&#39; -1&#39;找不到匹配。例如如果m.find = true则打印索引 否则打印-1