我有一个需要在字符串中匹配的模式,我无法找出正确的正则表达式模式。
一个字符串可能包含此模式的多个匹配项,我需要对其进行计数。
以小写英文字母开头。
以下任何一种或多种出现-较低的英文字母,数字和冒号。
一个正斜杠-/
一个或多个小写英文字母和igits的顺序。
一个反斜杠-\
一个或多个小写英文字母的顺序。
到目前为止,我已经成功编写了以下模式:
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);
但这并不能满足我的需求。任何人的帮助?
答案 0 :(得分:1)
您的正则表达式可以满足您的要求,但是您在\\
中添加了不需要的(\\/)
。
您希望输出为8,但是有7个捕获组。如果您还算全场比赛,则可以得到8。
(([a-z]+)([a-z0-9:]*)(/)([a-z0-9]+)(\\\\)([a-z]+))
要仅获取不带分组构造的匹配项,可以使用更紧凑的版本,并且可以添加锚点以匹配字符串^$
的开头和结尾
^[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);