我的模式不正确的地方(Java中的正则表达式)



我有一些字符串数据,有一些像这样的模式:"0x4F 0xBB 0x74 0xA9"

    有四个部分。每个部分有三个或四个字符。
  1. 每部分以0x开头。
  2. 在各个部分之间我们有空间。
  3. 字符只是:A B C D E F
  4. 数字:0 - 9

**我想以字符串的形式返回这个模式!如何退货?假设我得到的样本输入字符串是:"vhmbjfbfbbdbd这是我的字符串0x4F 0xBB 0x74 0xA9和休息afhahjbsdvbskb的一部分"如何在匹配后返回此字符串:"0x4F 0xBB 0x74 0xA9"

String MP = MatchedPart(str).toString();
private static StringBuilder MatchedPart(String s) {
     List<String> sarr = Arrays.asList(s.split(" 0x[A-F0-9]{1,2} 0x[A-F0-9]{1,2} 0x[A-F0-9]{1,2} 0x[A-F0-9]{1,2}"));
     StringBuilder machpart = new StringBuilder();
     for(String t : sarr) {
         machpart = machpart.append(t) ;
     }
    return machpart ;
}

我写这个函数,它得到一个string和检查模式:

public static boolean test (String s) {
  Pattern pattern = Pattern.compile(" 0x[ABCDEF0-9] 0x[ABCDEF0-9] 0x[ABCDEF0-9] 0x[ABCDEF0-9]");
  Matcher matcher = pattern.matcher(s);
  if (matcher.find()){
    return true; 
  } 
  return false; 
}

根据你的问题使用如下:

    public class PatternIncorrect {
    public static void main(String[] args) {
        System.out.println("------Test 1------------- ");
        System.out.println(test1("0x4F 0xBB 0x74 0xA9"));
        System.out.println("------Test 2--------------");
        System.out.println(test2("0x4F 0xBB 0x74 0xA9"));
        System.out.println("------Test 3--------------");
        List<String> test3 = test3("0x4F 0xBB 0x74 0xA9asdasd0x4F 0xBB 0x74 0xA9mfdskf0x4F 0xBB 0x74 0xA9");
        for(String t : test3) {
            System.out.println(t);
        }
    }
    public static boolean test1(String str) {
        List<String> strings = Arrays.asList(str.split(" "));
        boolean isMatch = true;
        String regEx = "0x[1-9][ABCDEF]|0x[ABCDEF][1-9]|0x[1-9][1-9]|0x[ABCDEF][ABCDEF]";
        for (String s : strings) {
            if (!s.matches(regEx)) {
                System.out.println(s);
                isMatch = false;
                break;
            }
        }
        return isMatch;
    }
    public static boolean test2(String s) {
        String regEx = "0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2}";
        Pattern pattern = Pattern.compile(regEx);
        Matcher matcher = pattern.matcher(s);
        return matcher.find();
    }
    public static List<String> test3(String s) {
        String regEx = "0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2}";
       return Arrays.asList(s.split(regEx));
    }
}
在这里输入链接描述

Try

Pattern pattern = Pattern.compile(" 0x[ABCDEF1-9]{1,2} 0x[ABCDEF1-9]{1,2} 0x[ABCDEF1-9]{1,2} 0x[ABCDEF1-9]{1,2}");

如果您想更熟悉Java中的正则表达式,请阅读:https://docs.oracle.com/javase/tutorial/essential/regex/index.html

您的表达式以空白开始,从我所看到的,您的输入字符串没有。

而且,更重要的是,根据你的描述,你试图匹配3或4个字符,但根据你的表达,你总是期望3个。

Pattern pattern = Pattern.compile("0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2} 0x[A-F1-9]{1,2}");代替Pattern pattern = Pattern.compile(" 0x[ABCDEF1-9] 0x[ABCDEF1-9] 0x[ABCDEF1-9] 0x[ABCDEF1-9]");,应能正常工作。

为了记录,0x00也应该是一个有效的十六进制数,您的表达式似乎不认为它是有效的。

您可以将[ABCDEF1-9]替换为预定义的模式p{XDigit}

另一个建议:

Scanner sc = new Scanner(s);
int count = 0;
while(sc.hasNextInt(16)){
    sc.nextInt(16);
    count++;
}
return count == 4;

最新更新