如何在Java中为以下正则表达式创建模式字符串?

时间:2018-08-18 11:49:37

标签: java regex java-8 pattern-matching java-7

我有一个需要在字符串中匹配的模式,我无法找出正确的正则表达式模式。

一个字符串可能包含此模式的多个匹配项,我需要对其进行计数。

  1. 以小写英文字母开头。

  2. 以下任何一种或多种出现-较低的英文字母,数字和冒号。

  3. 一个正斜杠-/

  4. 一个或多个小写英文字母和igits的顺序。

  5. 一个反斜杠-\

  6. 一个或多个小写英文字母的顺序。

到目前为止,我已经成功编写了以下模式:

    Scanner sc=new Scanner(System.in);
    String line=sc.nextLine();
    String patern="(([a-z]+)([a-z0-9:]*)(\\/)([a-z0-9]+)(\\)([a-z]+))";
    Pattern r=Pattern.compile(patern);
    Matcher m=r.matcher(line);
    int count=0;
    while(m.find()) {       
        count+=1;
    }
    System.out.println(count);

但这并不能满足我的需求。任何人的帮助?

3 个答案:

答案 0 :(得分:1)

您的正则表达式可以满足您的要求,但是您在\\中添加了不需要的(\\/)

您希望输出为8,但是有7个捕获组。如果您还算全场比赛,则可以得到8。

(([a-z]+)([a-z0-9:]*)(/)([a-z0-9]+)(\\\\)([a-z]+))

Regex demo

Demo Java

要仅获取不带分组构造的匹配项,可以使用更紧凑的版本,并且可以添加锚点以匹配字符串^$的开头和结尾

^[a-z][a-z0-9:]*/[a-z0-9]+\\[a-z]+$

在Java中:

^[a-z][a-z0-9:]*/[a-z0-9]+\\\\[a-z]+$

答案 1 :(得分:0)

以下内容可能会有所帮助:

^[a-z]+[a-z0-9:]*\/[a-z0-9]+\\[a-z]+

答案 2 :(得分:0)

您在这里:

                Scanner sc=new Scanner(System.in);
                String line=sc.nextLine();
                String patern="^[a-z][a-z0-9:]*\\/[a-z0-9]+\\\\[a-z]+$";
                Pattern r=Pattern.compile(patern);
                Matcher m=r.matcher(line);
                int count=0, i=0;
                while(line.length()>i) 
                {
                    int j=0;
                    while(line.substring(i).length()>j)
                    {
                        if(m.find())
                        {
                            count+=1;
                            //System.out.println("at i="+i+"wher count="+count);
                        }
                        j++;
                        m=r.matcher(line.substring(i).substring(0,j));
                    }

                    i++;
                    m=r.matcher(line.substring(i));

                }
                List<String> li=new ArrayList<>();
                System.out.println(count);