为什么正则表达式末尾少匹配一个字符?

时间:2018-06-29 12:25:34

标签: java regex

问题是最后一个字符永远不会匹配。 当我尝试使用group进行显示时,它将显示除最后一个字符以外的所有匹配项。 在所有情况下都相同。 下面是代码及其o / p。

package mon;
import java.util.*;
import java.util.regex.*;

class HackerRank {

static void Pattern(String text) {
    String p="\\d{1,2}|(0|1)\\d{2}|2[0-4]\\d|25[0-5]";
    String pattern="(("+p+")\\.){3}"+p;

    Pattern pi=Pattern.compile(pattern);
    Matcher m=pi.matcher(text);
//  System.out.println(m.group());
    if(m.find() && m.group().equals(text))
        System.out.println(m.group()+"true");
    else
        System.out.println(m.group()+" false");
   }
   public static void main(String[] args) {

    Scanner sc=new Scanner(System.in);
    while(sc.hasNext()) {
        Pattern(sc.next());
    }
   sc.close();


   }

}

I / P:000.12.12.034; O / P:000.12.12.03错误

1 个答案:

答案 0 :(得分:0)

您应该在八位位组模式内正确分组替代项:

String p="(?:\\d{1,2}|[01]\\d{2}|2[0-4]\\d|25[0-5])";
//        ^^^                                     ^

然后像这样建立模式

String pattern = p + "(?:\\." + p + "){3}";

它将变得更有效率。然后,使用matches要求完整的字符串匹配:

if(m.matches()) {...

查看Java demo

String p="(?:\\d{1,2}|[01]\\d{2}|2[0-4]\\d|25[0-5])";
String pattern = p + "(?:\\." + p + "){3}";
String text = "192.156.34.56";
// System.out.println(pattern); => (?:\d{1,2}|[01]\d{2}|2[0-4]\d|25[0-5])(?:\.(?:\d{1,2}|[01]\d{2}|2[0-4]\d|25[0-5])){3}
Pattern pi=Pattern.compile(pattern);
Matcher m=pi.matcher(text);
if(m.matches())
    System.out.println(m.group()+" => true");
else
    System.out.println("False"); => 192.156.34.56 => true

还有here is the resulting regex demo