我有一些字符串数据,有一些像这样的模式:"0x4F 0xBB 0x74 0xA9"
- 有四个部分。每个部分有三个或四个字符。
- 每部分以0x开头。
- 在各个部分之间我们有空间。
- 字符只是:A B C D E F
- 数字: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;