java - 为什么正则表达式最后少匹配一个字符?

标签 java regex

问题是最后一个字符永远不会匹配。 当我尝试使用组显示时,它显示除最后一个字符之外的所有匹配项。 在所有情况下都是一样的。 下面是代码及其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();


   }

}

IP:000.12.12.034; O/P:000.12.12.03假

最佳答案

您应该在八位字节模式内正确分组替代方案:

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 .

关于java - 为什么正则表达式最后少匹配一个字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51101729/

相关文章:

java - 如何使用 antlrv3 生成的词法分析器和解析器提供语法高亮显示?

php - 我怎样才能只从 preg_match 中获取命名的捕获?

regex - 匹配 HH :MM time format 的正则表达式

javascript - 使用 iframe 从字符串中获取 src 和其他文本

Java String UTF-8 将 0xFF 解码为 0xC3BF

java - Class.forName 等效于从 String 创建 ParameterizedType

java - 如何从通过串行端口接收的数据创建 BufferedImage

java - 创建芝麻存储库

javascript - 根据模式从字符串中捕获值

javascript - RegEx javascript 不正确匹配